按 etime 排序 PS 命令

Sort PS command by etime

所以我正在尝试开发一个脚本来查找特定进程,并杀死 运行 时间最长的进程。试图让命令按经过的时间排序正在成为问题。这是我 运行 的命令,我知道有很多 |并且可能更清洁为什么要执行所有这些操作,但我对使用 awk 还很陌生。

ps -eo pid,cmd,stat,etime --sort=etime | grep cassi32 | awk ' == "/rESTECH"' | awk ' == "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 排序的任何想法。完成后我可以处理杀戮部分。

您可以将命令行缩减为:

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

但是在进行任何排序之前唯一要做的就是你的 ps 命令,所以如果这没有产生你想要的顺序,那么请阅读你的 ps 手册页来找出你的选项真的应该用。

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

你能在最后通过管道进行排序吗?并可能仅使用一个 awk 来简化管道:

例如

ps -eo args,pid,etime | awk ' == "cassi32" &&  == "/rESTECH" &&  == "S"' | sort -k 5

您拥有的 ps 版本(以及我正在测试的版本)似乎无法正确排序基于时间的键的某些子集。不过,这似乎可以满足您的要求:

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

start_time 排序似乎更可靠一些,至少在我的系统上是这样,而且它与 etime 或运行时间直接相关。