我使用ps ef并ps rf不少。
ps ef
ps rf
这是以下示例输出ps rf:
PID TTY STAT TIME COMMAND 3476 pts/0 S 0:00 su ... 3477 pts/0 S 0:02 \_ bash 8062 pts/0 T 1:16 \_ emacs -nw ... 15733 pts/0 R+ 0:00 \_ ps xf 15237 ? S 0:00 uwsgi ... 15293 ? S 0:00 \_ uwsgi ... 15294 ? S 0:00 \_ uwsgi ...
今天,我只需要在脚本中检索uwsgi 的 主进程 (因此我只需要15237,而不想要15293或15294)。
从今天开始,我尝试了一些ps rf | grep -v ' \\_ '……但是我想要一种 更清洁的方法 。
ps rf | grep -v ' \\_ '
我还遇到了unix.com论坛中的另一种解决方案:
ps xf | sed '1d' | while read pid tty stat time command ; do [ -n "$(echo $command | egrep '^uwsgi')" ] && echo $pid ; done
但是仍然有 很多管道 和 丑陋的招数 。
真的没有ps选择或更巧妙的技巧(也许使用 awk )来完成该任务吗?
ps
与@netcoder讨论答案后,他使用了一个不错的技巧:D 使用fon ps总是可以使父项位于最前面。
f
这应该工作:
$ ps hf -opid -C <process> | awk '{ print $1; exit }'
正如我在评论中提到的那样,这只会返回pid一个过程。
pid
我会去:
ps rf -opid,cmd -C <process-name> | awk '$2 !~ /^[|\\]/ { print $1 }'
那是:
r
e
-opid,cmd
-C <process>
然后
\
|
简单测试:
$ ps f -opid,cmd -Cchromium PID CMD 2800 /usr/lib/chromium/chromium --type=zygote --enable-seccomp-sandbox 2803 \_ /usr/lib/chromium/chromium --type=zygote --enable-seccomp-sandbox 2899 \_ /usr/lib/chromium/chromium --type=renderer --enable-seccomp-sandbox --lang=en-US --force-fieldtrials=ConnCountImpact/conn_count_6/ConnnectB 2906 | \_ /usr/lib/chromium/chromium --type=renderer --enable-seccomp-sandbox --lang=en-US --force-fieldtrials=ConnCountImpact/conn_count_6/Connn [ ... snip ... ] 2861 \_ /usr/lib/chromium/chromium --type=renderer --enable-seccomp-sandbox --lang=en-US --force-fieldtrials=ConnCountImpact/conn_count_6/ConnnectB 2863 \_ /usr/lib/chromium/chromium --type=renderer --enable-seccomp-sandbox --lang=en-US --force-fieldtrials=ConnCountImpact/conn_count_6/Connn 2794 /usr/lib/chromium/chromium --enable-seccomp-sandbox --memory-model=low --purge-memory-button --disk-cache-dir=/tmp/chromium 2796 \_ /usr/lib/chromium/chromium --enable-seccomp-sandbox --memory-model=low --purge-memory-button --disk-cache-dir=/tmp/chromium 3918 \_ /usr/lib/chromium/chromium --type=gpu-process --channel=2794.45.1891443837 --gpu-vendor-id=0x10de --gpu-device-id=0x0611 --gpu-driver-version - 25308 \_ [chromium] <defunct> 31932 \_ /usr/lib/chromium/chromium --type=plugin --plugin-path=/usr/lib/mozilla/plugins/libflashplayer.so --lang=en-US --channel=2794.1330.1990362572 $ ps f -opid,cmd -Cchromium | awk '$2 !~ /^[|\\]/ { print $1 }' PID 2800 2794 $ # also supressing the header of ps (top line 'PID') -- add 'h' to ps $ ps hf -opid,cmd -Cchromium | awk '$2 !~ /^[|\\]/ { print $1 }' 2800 2794