ps 仅显示匹配多个条件 (AND) 的进程

ps 仅显示匹配多个条件 (AND) 的进程

根据ps手册页:

除下述情况外,流程选择选项是附加的。放弃默认选择,然后将所选进程添加到要显示的进程集中。因此,如果流程满足任何给定的选择标准,就会显示该流程。

我认为这意味着匹配是“OR”,而不是“AND”。

我正在开发自己的锁定脚本,该脚本创建一个目录(mkdir mutex)并将 PPID 和 PID 信息写入该目录中的文件中。脚本中的功能之一是通过循环遍历所有锁定文件并提取 $PPID 和 $PID 来清理过时的锁定文件。接下来,它确定具有 PID $PID 和 PPID $PPID 的进程是否仍在运行。

然而ps我越来越全部具有 PPID $PPID 的进程,我也得到 PID $PID。我希望它只显示 pid $PID 和 ppid $PPID 的进程

我知道grep在这里直观上很有用,但是有没有一种“更便宜”的方法可以使用?也许是另一个与流程相关的实用程序?


procps-3.2.7-16.el5

答案1

我刚查了一下,好像CentOS 6.6pgrep没有这个-F选项,所以这个不适用。我将把这个答案留在这里,因为它在其他情况下可能有用。


pgrep可能是你想要的:

-P, --parent ppid,...
      Only match processes whose parent process ID is listed.
-F, --pidfile file
      Read  PID's  from  file.  This option is perhaps more useful for
      pkill than pgrep.

看起来pgrepwith-F会过滤 PID 以匹配文件中的 PID:

$ pgrep libvirtd
1343
18471
$ pgrep -F /var/run/libvirtd.pid -P 1
1343
$ echo -n 18471 > other-libvirtd.pid
$ pgrep -F other-libvirtd.pid -P 1
$ pgrep -F other-libvirtd.pid
18471

答案2

使用一个选项并使用或ps进一步过滤是一种合理的方法。grepawk

请务必传递-o选项ps并将字段限制为您需要的字段。在每个字段名称后使用等号来隐藏标题行。如果您不需要命令名称,请不要包含commor args,它可能包含换行符(并且在任何安全敏感上下文中,如果它们包含换行符,请确保您的脚本执行合理的操作)。例如,如果您只需要 PID,并希望属于某个组并在某个 TTY 上运行的所有进程,那么您可以使用以下命令收集 PID:

pid_list=$(ps -t tty3 -o 'pid= gid=' | awk '$2 == 1234 || $2 == "somegroup"')

就你而言,这太过分了。有一个进程具有给定的 PID,因此条件-p $PID就是您需要的所有过滤。通过该PID检索进程的PPID,并将其与期望值进行比较。ps如果没有具有该 PID 的进程,则不会输出任何内容。

read pid expected_ppid <"$pidfile"
actual_ppid=$(ps -o ppid= -p "$pid")
if [ "$actual_ppid" = "$expected_ppid" ]; then …

请记住,如果您找到具有正确特征的进程,它可能是同一个进程,也可能是不相关的进程,因为您期望的进程早已死亡并且其 PID 已被重用。

答案3

这是一个 Shell 解决方案,不需要除ps

if [[ `ps --pid $PID -oppid=` = $PPID ]]
then
   : still running
else
   : not running
fi

相关内容