列出运行时间超过3小时的进程

列出运行时间超过3小时的进程

笔记:

我有一个旧版本,ps没有选项可以用来-o etimes获取以秒为单位的时间。所以解决方案是列出运行时间超过 2 小时的进程这里不能直接使用。


我想列出运行时间超过 3 小时的进程。下面是我用来列出进程的命令

命令

ps -Ao stime,etime,cmd --sort=start_time | grep "/home/mose/bin/hi.sh" | grep -v "grep"

输出

Jun06 1-03:36:53 /bin/ksh /home/mose/bin/hi.sh -j KendaEVALUATION_7 -o 220606
Jun06 1-03:36:53 /bin/ksh /home/mose/bin/hi.sh -j KendaEVALUATION_5 -o 220606
Jun06 1-03:36:53 /bin/ksh /home/mose/bin/hi.sh -j KendaEVALUATION_8 -o 220606
Jun06 1-03:36:53 /bin/ksh /home/mose/bin/hi.sh -j KendaEVALUATION_6 -o 220606
07:54 03:43:46 /bin/ksh /home/mose/bin/hi.sh -j Kenda -o 220607
08:01 03:36:54 /bin/ksh /home/mose/bin/hi.sh -j KendaWORKING_TIME_6 -o 220607
08:01 03:36:54 /bin/ksh /home/mose/bin/hi.sh -j KendaFRONTOFFICE_5 -o 220607
08:01 03:36:54 /bin/ksh /home/mose/bin/hi.sh -j KendaWORKING_TIME_4 -o 220607
08:01 03:36:54 /bin/ksh /home/mose/bin/hi.sh -j KendaWORKING_TIME_8 -o 220607
08:01 03:36:54 /bin/ksh /home/mose/bin/hi.sh -j KendaWORKING_TIME_5 -o 220607
08:01 03:36:54 /bin/ksh /home/mose/bin/hi.sh -j KendaWORKING_TIME_3 -o 220607
08:01 03:36:54 /bin/ksh /home/mose/bin/hi.sh -j KendaWORKING_TIME_2 -o 220607
08:01 03:36:54 /bin/ksh /home/mose/bin/hi.sh -j KendaWORKING_TIME_7 -o 220607
08:01 03:36:54 /bin/ksh /home/mose/bin/hi.sh -j KendaWORKING_TIME_1 -o 220607
08:30 03:07:01 /bin/ksh /home/mose/bin/hi.sh -j JituSUBT -o 220607
08:40 02:56:58 /bin/ksh /home/mose/bin/hi.sh -j JituREFRESH -o 220607
09:10 02:27:32 /bin/ksh /home/mose/bin/hi.sh -j KendaWOCAS -o 220607
09:56 01:41:33 /bin/ksh /home/mose/bin/hi.sh -j KendaBACKOFFICE_CCB_KUA_4 -o 220607

那么如何才能只列出运行时间超过 3 小时的进程呢?

答案1

如果该进程已运行超过 3 小时,那么您将-在第二个字段中有 一个(因为它已经运行了一天多,所以您将有类似的内容1-03:36:53),或者第二个字段的第一个数字将为3或更大。因此,还可以稍微简化您的命令,您可以这样做:

ps -C hi.sh -o stime,etime,cmd --sort=start_time |
    awk '$2 ~ /-/ || $2 ~ /^(0[3-9]|[12]):[0-9]+:[0-9]+/'

在您的示例ps输出中,将产生:

Jun06 1-03:36:53 /bin/ksh /home/mose/bin/hi.sh -j KendaEVALUATION_7 -o 220606
Jun06 1-03:36:53 /bin/ksh /home/mose/bin/hi.sh -j KendaEVALUATION_5 -o 220606
Jun06 1-03:36:53 /bin/ksh /home/mose/bin/hi.sh -j KendaEVALUATION_8 -o 220606
Jun06 1-03:36:53 /bin/ksh /home/mose/bin/hi.sh -j KendaEVALUATION_6 -o 220606
07:54 03:43:46 /bin/ksh /home/mose/bin/hi.sh -j Kenda -o 220607
08:01 03:36:54 /bin/ksh /home/mose/bin/hi.sh -j KendaWORKING_TIME_6 -o 220607
08:01 03:36:54 /bin/ksh /home/mose/bin/hi.sh -j KendaFRONTOFFICE_5 -o 220607
08:01 03:36:54 /bin/ksh /home/mose/bin/hi.sh -j KendaWORKING_TIME_4 -o 220607
08:01 03:36:54 /bin/ksh /home/mose/bin/hi.sh -j KendaWORKING_TIME_8 -o 220607
08:01 03:36:54 /bin/ksh /home/mose/bin/hi.sh -j KendaWORKING_TIME_5 -o 220607
08:01 03:36:54 /bin/ksh /home/mose/bin/hi.sh -j KendaWORKING_TIME_3 -o 220607
08:01 03:36:54 /bin/ksh /home/mose/bin/hi.sh -j KendaWORKING_TIME_2 -o 220607
08:01 03:36:54 /bin/ksh /home/mose/bin/hi.sh -j KendaWORKING_TIME_7 -o 220607
08:01 03:36:54 /bin/ksh /home/mose/bin/hi.sh -j KendaWORKING_TIME_1 -o 220607
08:30 03:07:01 /bin/ksh /home/mose/bin/hi.sh -j JituSUBT -o 220607

awk命令正在搜索第二个字段 ( $2) 包含 a或以 ( )-开头的行,或者 a后跟 3 到 9 之间的数字 ( ),或者 ( ) 1 或 2 ( ),然后是该行继续使用由( )分隔的两组数字。^00[3-9]|[12]:[0-9]+:[0-9]+

答案2

根据手册页,该etime字段的格式是[[DD-]hh:]mm:ss,因此 Perl 正则表达式之类的/(((\d+)-)?(\d+):)?\d+:\d+/应该可以匹配它,并捕获 和 中的日期和$3时间$4。 (\d+匹配任意数量的数字,(...)?是可选组,所有括号捕获匹配部分。日期和小时是与左侧第三个和第四个左括号对应的部分。)

所以,像这样:

ps -Ao stime,etime,cmd --sort=start_time  | 
  perl -ane '$F[1] =~ /(((\d+)-)?(\d+):)?\d+:\d+/; print if $3 > 0 || $4 >= 3'

当 autosplit( -a) 打开时,输入行的字段出现在数组中@F。该代码片段采用输入的第二个字段$F[1](从零开始编号),并将其与上面的正则表达式进行匹配。然后,如果天数大于零,或者小时数为三或更多,我们将打印该行。如果值不存在,它们将被捕获为未定义的值,这些值比较为零,因此例如12:34将给出相同的结果,00:12:34并且不会匹配。

相关内容