2010-06-12 24 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