ps forrest for session id

时间:2010-06-12 00:18:19

标签: bash shell process

我经常想要了解正在运行的进程及其关系;我通常通过习惯运行ps auxfww并最终使用grep来处理相关过程。

一直在思考这个问题,我试图创建一个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上,但感觉它更像是一个编程问题)

2 个答案:

答案 0 :(得分: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“family”函数:

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

答案 1 :(得分:0)

简单读出流程及其关系的选项是:

ps -ejH