笔记:
我有一个旧版本,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 ( ),然后是该行继续使用由( )分隔的两组数字。^
0
0[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
并且不会匹配。