2016-11-13 83 views
0

我正在使用ps命令來監視某些進程。不過,我希望將時間輸出作爲Unix時間戳記。ps start_time as timestamp

我使用的命令:

ps -eo class,s,user,pid,pcpu,stat,start_time,cputime,args --sort=class | \ 
    awk '$1 != "RR" && $1 != "FF" {print $0; next } 0' 

謝謝!

回答

2

使用etimes選項(經過的時間進程開始,以秒爲單位)和awksystime()函數返回以秒爲當前的時間戳。

假設第七列是etimes,那麼AWK表達應該是這樣的:

NR == 1 ? "TIMESTAMP" : systime() - $7 

例子:

ps -eo class,s,user,pid,pcpu,stat,etimes,cputime,args --sort=class | awk \ 
    '$1 != "RR" && $1 != "FF" {print $0, NR == 1 ? "TIMESTAMP" : systime() - $7 }' 

樣本輸出

CLS S USER  PID %CPU STAT ELAPSED  TIME COMMAND TIMESTAMP 
TS S root   1 0.0 Ss  1717 00:00:01 init [3] 1479001705 
TS S root   2 0.0 S  1717 00:00:00 [kthreadd] 1479001705 
TS S root   3 0.0 S  1717 00:00:00 [ksoftirqd/0] 1479001705 

如果你想取代第七欄,您可以覆蓋$7變量:$7 = systime() - $7

如果命令的結果應該是進一步解析,我會--no-headers選項去掉標題,例如:

ps --no-headers -eo class,s,user,pid,pcpu,stat,etimes,cputime,args \ 
    --sort=class | awk '$1 != "RR" && $1 != "FF" { $7 = systime() - $7; print }' 

樣本輸出

TS S root 1 0.0 Ss 1479001705 00:00:01 init [3] 
TS S root 2 0.0 S 1479001705 00:00:00 [kthreadd] 
TS S root 3 0.0 S 1479001705 00:00:00 [ksoftirqd/0] 

注意,有不需要腳本中的next語句,因爲它的用途是立即停止處理當前記錄並繼續下一條記錄,並且沒有語句(模式 - 動作對)在腳本結尾跳過。

+0

實際上Q中有'next'後面有另一個腳本元素,即'0'。但它永遠不會匹配,所以仍然不需要「下一個」。 –