我正在尝试让所有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'
但我不知道经过的列的单位是什么。
答案 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小时。
<强> ETIME 强>
在
POSIX
语言环境中,自流程启动以来经过的时间,格式如下:[[dd-]hh:]mm:ss
其中dd
代表天数,hh
小时数,mm分钟数和ss
秒数。dd
字段应为十进制整数。hh
,mm
和ss
字段应为左边填充的两位十进制整数。
答案 1 :(得分:0)
ps -eo pid,etime,comm,user | awk '$2~/[0-9][0-9]*-/ && /\.rb/ {print }'