2011-08-14 63 views
1

命令如何在Unix/Linux命令ps中使用S輸出修飾符?

ps -o time -p 21361 

作品;然而我需要的是包括全部 子女的過程的運行時間。例如,如果21361是一個bash腳本,它調用其他腳本, 然後我想要總運行時間,包括所有孩子的運行時間。

現在的PS文件列出了 「輸出調節劑」:

S 

Sum up some information, such as CPU usage, from dead child processes into their parent. This is useful for examining a system where a parent process repeatedly forks off short-lived children to do work. 

聽起來恰到好處。不幸的是,沒有ps語法的規範,所以 我不知道在哪裏放置「S」!現在幾個小時,我嘗試了很多組合,但是 或者我得到語法錯誤,或者「S」什麼都不做。而在互聯網上你只能找到 有關ps的基本信息(總是相同的),特別是「S」修飾符 我在任何地方都找不到,也沒人解釋ps的語法。

+0

但是父進程是不是它們全部最長的運行進程?你有意嘗試'重新計算'childern處理時間嗎?祝你好運。 – shellter

回答

2

我不確定,但可能是ps在這方面有點錯誤。試試這裏:

$ ps p 12104 k time 
PID TTY  STAT TIME COMMAND 
12104 ?  Ss 16:17 /usr/sbin/apache2 -k start 

$ ps p 12104 k time S 
PID TTY  STAT TIME COMMAND 
12104 ?  Ss 143:16 /usr/sbin/apache2 -k start 

這是使用ps的BSD選項。它適用於我的機器,但是您會得到額外的標題行和額外的列。我會用TR削減他們離開並切斷:

$ ps p 12104 k time S | tail -n 1 | tr -s '[:space:]' | cut -d ' ' -f 4 
143:39 
$ ps p 12104 k time | tail -n 1 | tr -s '[:space:]' | cut -d ' ' -f 4 
16:17 
+2

謝謝!我會說,ps絕對是越野車:你的組合看起來是**唯一的一個**來實現結果 - 其他所有應該相當或更強大的東西(例如切掉多餘的輸出)不起作用。 –

+2

不客氣。如果我或喬納森的答案滿足您的問題,請不要忘記標記爲答案。 – Arne

0

在MacOS X(10.7,獅子)的手冊頁說:

-S更改處理時間由所有退出的孩子求和計算方法到他們的父母程序。

所以,我能夠用得到的輸出:

$ ps -S -o time,etime,pid -p 305 
    TIME  ELAPSED PID 
    0:00.12 01-18:31:07 305 
$ 

然而,該輸出是不是真的從省略了「-S」選項時有什麼不同。

我想:

$ ps -S -o time,etime,pid -p 305 
    TIME  ELAPSED PID 
    0:00.14 01-18:43:59 305 
$ time dd if=/dev/zero of=/dev/null bs=1m count=100k 
102400+0 records in 
102400+0 records out 
107374182400 bytes transferred in 15.374440 secs (6983941055 bytes/sec) 

real 0m15.379s 
user 0m0.056s 
sys  0m15.034s 
$ ps -S -o time,etime,pid -p 305 
    TIME  ELAPSED PID 
    0:00.14 01-18:44:15 305 
$ 

正如你所看到的,系統時間採用15秒的花複製/dev/zero/dev/null沒有得到列入摘要。

在這個階段,找出'-S'選項的唯一方法就是查看源代碼。您可以在FreeBSD版本中查找sumrusage,例如,在FreeBSD

相關問題