2010-06-12 61 views
1

通常我想獲得一個很好的讀數什麼過程正在運行和他們的關係;我通常習慣於運行ps auxfww,並且最終grep正在討論這個過程。ps forrest會話ID

一直在考慮這個問題,我嘗試創建一個oneliner來獲取ps ufww格式的進程樹,該進程樹的所有進程都有由任意進程名指定的會話ID;在下面的代碼結束了:

ps ufww --sid=$(ps -C apache2 -o sess --no-headers | sort | uniq | grep -v -E '^ +0$' | awk 'NR==1{x=$0;next}NF{x=x","$0};END{gsub(/[[:space:]]*/,"",x);print x}') 

給予例如以下的輸出:

USER  PID %CPU %MEM VSZ RSS TTY  STAT START TIME COMMAND 
root  4157 0.0 0.1 41264 3120 ?  Ss Jun11 0:00 /usr/sbin/apache2 -k start 
www-data 4329 0.0 0.0 41264 1976 ?  S Jun11 0:00 \_ /usr/sbin/apache2 -k start 
www-data 4330 0.0 0.0 41264 2028 ?  S Jun11 0:00 \_ /usr/sbin/apache2 -k start 
www-data 4331 0.0 0.0 41264 2028 ?  S Jun11 0:00 \_ /usr/sbin/apache2 -k start 
www-data 4332 0.0 0.0 41264 2028 ?  S Jun11 0:00 \_ /usr/sbin/apache2 -k start 
www-data 4333 0.0 0.0 41264 2032 ?  S Jun11 0:00 \_ /usr/sbin/apache2 -k start 
www-data 6648 0.0 0.0 41264 1884 ?  S Jun11 0:00 \_ /usr/sbin/apache2 -k start 
www-data 6654 0.0 0.0 41264 1884 ?  S Jun11 0:00 \_ /usr/sbin/apache2 -k start 
www-data 6655 0.0 0.0 41264 1884 ?  S Jun11 0:00 \_ /usr/sbin/apache2 -k start 

我現在不知道有沒有人有一個更好的主意來解決這個問題?有沒有什麼比這更容易「在線」,並提供更多或更好的信息?例如,我實際上想要包含所有孩子相對於任何父母。

(不確定這是否應該是在SF代替,但覺得它更像是一個編程的問題)

+0

ps是由腳本或人類解析的絕對怪物。我有點印象深刻,你得到了儘可能多的。如果按下更遠的話,我會放棄使用ps並從'/ proc/[0-9] */stat'工作,這在語法上更加規律。 – msw 2010-06-12 00:49:16

回答

0

這裏是你略短,可能稍快的版本。它可能依賴於一些GNU特有的功能:

ps ufww --sid=$(ps -C apache2 -o sess= | sort -u | grep -v -E '^ +0$' | tr $'\n' ',' | sed 's/,$/\n/; s/ //g') 

超過50個字符短。

尚短且沒有錯綜複雜的陰謀:

ps -C apache2 fww -o user,pid,%cpu,%mem,vsz,rss,tty,stat,start,time,cmd 

看!沒有滾動條!

我不明白你的意思:

例如我真的希望有相對包括了所有孩子的任何父母。

難道不是ps auxfww做什麼?

如果你想輕鬆地指定一個進程名作爲參數,你可以創建一個PS「家族」功能:

psf() { ps -C $1 fww -o user,pid,%cpu,%mem,vsz,rss,tty,stat,start,time,cmd; } 
0

有過程及其關係的簡單讀出的選項是:

ps -ejH