通过etime排序PS命令

时间:2015-05-01 14:49:10

标签: sorting awk kill ps

所以我正在尝试开发一个可以找到特定进程的脚本,并杀死运行时间最长的进程。试图按经过时间排序命令正成为问题。这是我正在运行的命令,我知道有很多|并且可能更清洁为什么要做这一切,但我使用awk相当新。

ps -eo pid,cmd,stat,etime --sort=etime | grep cassi32 | awk '$3 == "/rESTECH"' | awk '$4 == "S"'

,我得到的输出就是这个。

5703 cassi32 /rESTECH            S          00:40
65504 cassi32 /rESTECH            S     1-21:45:39
65520 cassi32 /rESTECH            S       03:21:39
65521 cassi32 /rESTECH            S     3-15:02:37
65531 cassi32 /rESTECH            S     1-21:44:39

正如您所看到的那样,etime列似乎没有按任何特定顺序排列,而是按PID排序。

有关如何通过etime排序的任何想法。一旦完成,我可以照顾杀戮部分。

2 个答案:

答案 0 :(得分:4)

您拥有的ps版本(以及我正在测试的版本)似乎在基于时间的密钥的某些子集上正确排序时遇到问题。这似乎做你想要的,但是:

ps -eo pid,cmd,stat,etime --sort start_time | awk '$2 == "cassi32" && $3 == "/rESTECH" && $4 == "S"'

start_time排序似乎更可靠,至少在我的系统上,它与etime或已用时间直接相关。

答案 1 :(得分:1)

您可以将命令行缩减为:

ps -eo pid,cmd,stat,etime --sort=etime |
awk '/cassi32/ && ($3=="/rESTECH") && ($4=="S")'

但是上面做任何排序的唯一事情是你的ps命令,所以如果那不是你想要的订单,那么请阅读你的ps手册页以找出你真正应该选择哪些选项正在使用。

我可以访问多台UNIX计算机但没有一台ps支持您正在使用的选项,因此我无法对其进行测试。