2015-05-01 69 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