gpt4 book ai didi

linux - ps:只获取父进程的干净方法?

转载 作者:IT王子 更新时间:2023-10-29 00:12:05 26 4
gpt4 key购买 nike

我经常使用 ps efps 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 '\\_ '...但我想要一种更简洁的方式

我还从 unix.com 的论坛上看到了另一个解决方案:

ps xf | sed '1d' | while read pid tty stat time command ; do [ -n "$(echo $command | egrep '^uwsgi')" ] && echo $pid ; done

但仍然很多管道丑陋的把戏

是否真的没有 ps 选项或更简洁的技巧(可能使用 awk)来实现这一点?

最佳答案

在与@netcoder 讨论他的回答评论后,他使用了一个不错的技巧 :D
使用 fps总是让 parent 处于领先地位,这很棒。

这应该可以正常工作:

$ ps hf -opid -C <process> | awk '{ print $1; exit }'

正如我在评论中提到的,这将返回 pid只有一个过程。


我会选择:

ps rf -opid,cmd -C <process-name> | awk '$2 !~ /^[|\\]/ { print $1 }'

即:

  • 列出正在运行的进程 r (或 e 如果你想要一切)
  • 连同父/子图 f
  • 只输出pid和命令名-opid,cmd
  • 仅对给定进程-C <process>

然后

  • 如果第二个字段 - 即命令 ( -opid,cmd ) - 不以 \ 开头或 |那么它是一个父进程,所以打印第一个字段 - 这是 pid。

简单测试:

$ 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

关于linux - ps:只获取父进程的干净方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12373309/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com