ps命令和etime

时间:2017-11-27 11:14:08

标签: bash shell unix awk

我正在尝试让所有ruby进程在我的服务器上运行超过24小时。

使用PS我可以得到这个:

ps -eo pid,etime,cmd | grep .rb | grep -v grep | awk '{print $1, $2}'

输出:

PID   ELAPSED
23484 07:54:41
23493 07:54:41
23504 07:54:41
23515 07:54:41
23535 07:54:40
23548 07:54:40
23670 07:54:37
31671 3-07:54:49
31807 3-07:54:48
31832 3-07:54:48
32308 3-07:54:40
32318 3-07:54:40
32331 3-07:54:40

在这种情况下,6个进程运行超过24小时。

那么,如何过滤此列以获得我需要的内容呢?

我的想法是使用awk,比如

awk '$2 > XXXX'

但我不知道经过的列的单位是什么。

2 个答案:

答案 0 :(得分:3)

您可以只使用一个ps命令及其--sort功能,根据Awk所需的运行时间和过滤结果进行排序,而不是在管道中耦合多个命令

ps -eo pid,etime,cmd --sort=start_time | awk '/\.rb/ && /[1-9]+[-]/'

过滤器/\.rb/ && /[1-9]+[-]/的含义意味着,包含模式.rb.的过滤行是需要转义的元字符)和包含数字的行(一个或多个)天[1-9]+)后跟-,因此如果有3-07:54:40表单的条目,则3-部分匹配以表示超过24小时。

根据POSIX documentation for ps

  

<强> ETIME

     

POSIX语言环境中,自流程启动以来经过的时间,格式如下:   [[dd-]hh:]mm:ss   其中dd代表天数,hh小时数,mm分钟数和ss秒数。 dd字段应为十进制整数。 hhmmss字段应为左边填充的两位十进制整数。

答案 1 :(得分:0)

ps -eo pid,etime,comm,user | awk '$2~/[0-9][0-9]*-/ && /\.rb/ {print }'