2015-05-01 70 views
3

所以我正在尝试开发一个脚本,它将找到特定的进程,并杀死一直运行时间最长的脚本。试图按照经过的时间对命令进行排序已成为问题。这里是我正在运行的命令,我知道有很多|并可能更干净为什么要这样做,但我对使用awk相当陌生。按etime排序PS命令

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

你希望它出现在什么顺序? 'ps'后没有任何东西会改变'ps'输出的顺序,所以这是你需要命令的命令。另外,你不需要在管道中使用grep + 2 awk命令,原始的'ps ...'输出以及你想要从脚本中获得的相应的最终输出。 –

+0

由于sort -k5n同意,所以显然在数字上对“数字”的定义进行了排序。尽管没有前导空格(如果单独使用该列)'sort -n'会给你一个不同的顺序。在该字段上的非数字“排序”可以将00:40,03:21:39,1-21:44:39,1-21:45:39,3-15:02:37作为输出排序。 –

回答

3

,你有ps版本(还有一个我与测试)似乎有正确排序基于时间的密钥的某个子集的问题。这似乎做你想要什么,但:

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

通过start_time排序似乎更可靠一些,至少在我的系统,而且它直接关系到etime或逝去的时间。

+0

您使用的是哪个版本的'ps'? – hek2mgl

+0

@ hek2mgl'ps --version'在CentOS 5.5上报告“procps version 3.2.7” - 有点旧(好吧,好的,古老的,真的......),我知道;自那时以来可能已经修复了一些错误。事实上,我的Debian 7.8系统“procps-ng version 3.3.3”通过etime正确排序... – twalberg

+0

我有3.3.9。我目前不知道它来自哪里,因为[项目页面](http://procps.sourceforge.net/download.html)上的最新下载是3.2.8。让我调查一下。 – hek2mgl

1

您可以减少您的命令行只是:

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

但上面做任何排序的唯一的事情就是你ps命令,这样如果不产生你想要然后读你ps男人顺序页面来找出你真的应该使用什么选项。

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

+0

问题中的命令应该已经有效。 (或者我没有得到这个问题)。你的优化使它完美... – hek2mgl

+0

为什么你在括号里加上'$ 3 ==“/ rESTECH /”'? – hek2mgl

+0

主要是为了清楚。我怀疑awk是否真的会把'a == b && c == d'视为'a ==(b &&(c == d))',但是在制作意图时没有伤害'(a == b)&&(c == d)'明确,所以它很清楚,然后我(以及其他任何人阅读脚本)不必考虑运算符优先级或评估顺序。 –

0

你能管排序在末尾?和可能只用一个AWK简化pipline:

例如

ps -eo args,pid,etime | awk '$2 == "cassi32" && $3 == "/rESTECH" && $4 == "S"' | sort -k 5 
+0

这并没有返回任何东西 – Deldran