当前位置: 首页 > 面试题库 >

ps:仅获取父进程的干净方法?

顾俊哲
2023-03-14
问题内容

我使用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
使用fon ps总是可以使父项位于最前面。

这应该工作:

$ 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))不是以a开头,\或者|它是父进程,那么请打印第一个字段(即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


 类似资料:
  • 本文向大家介绍WIN32程序获取父进程ID的方法,包括了WIN32程序获取父进程ID的方法的使用技巧和注意事项,需要的朋友参考一下 学过windows程序设计的人都知道,windows中的进程是可以有父子关系的,拥有父子关系的进程,一旦父进程结束,子进程有会随之退出。但是如果进程之间没有父子关系,我们如何让子进程在父进程退出是也同时跟着退出呢?方法有很多,本文介绍其中的一种利用父进程ID的方案,实

  • 问题内容: 从Python 2.6的迭代器中获取最后一项的最佳方法是什么?例如说 从中获取最短代码/最干净的方法是什么? 我可以这样做,但是效率似乎不高: 问题答案:

  • 问题内容: 是否可以从Shell脚本中的父进程ID获取子进程ID? 我有一个要使用Shell脚本执行的文件,这会导致一个新进程 process1 (父进程)。这个 过程1 已经分叉的另一个进程 过程2 (子进程)。使用脚本,我可以使用以下命令获取 process1 的pid : 但我无法获取子进程的pid。 问题答案: 只需使用:

  • 是否可以从外壳脚本中的父进程ID获取子进程ID? 我有一个要使用shell脚本执行的文件,这会导致一个新的进程process1(父进程)。此进程1已经派生了另一个进程process2(子进程)。使用脚本,我可以使用以下命令获得进程1的pid: 但是我无法获取子进程的pid。

  • 问题内容: 我尝试了google,但是发现它获取了 当前 进程的父pid 。 我需要类似的东西,有这样的东西吗?基本上获取某些进程的pid,然后返回父进程的pid。 问题答案: 我认为最简单的方法是打开“ / proc”并解析内容。 您将找到ppid作为/ proc / pid / stat的第四个参数

  • 问题内容: 顾名思义,是否有适当的方法来设置一些初始CSS属性(或类),并告诉浏览器将其转换为另一个值? 这不会激活Chrome 29 / Firefox 23中元素的不透明度。这是因为(源): […]您会发现,如果同时应用两组属性,则立即应用一组属性,然后浏览器将尝试优化属性更改,而忽略您的初始属性并防止过渡。在幕后,浏览器在绘画之前先批处理属性更改,这通常会加快渲染速度,但有时可能会产生不利影