如何确定“ls”等进程的父进程

如何确定“ls”等进程的父进程

我已经阅读了确定正在运行的进程的父进程的方法,但是如果进程的生命周期太短,无法运行 pstree 之类的命令,而进程还没有完成,我该如何确定它的父进程呢?

答案1

我不确定我是否完全理解了你的问题或场景(所以也许我不应该回答它),但是你给出了命令的示例ls,以及如何确定它的父进程,因为你不能用pstree或之类的东西来检查它ps -efH

如果有原因你需要这些信息。否则我认为我们会看到一个XY 问题

一般来说,没有办法获得 PPID追溯性地。需要在子进程运行时捕获它。

但对于问题正如你问的那样,答案似乎很简单。 的父进程ls始终是启动它的进程。通常,这将是 shell 本身。

例如,如果你ls从父进程内部运行bash曾是

echo $$

这将为您提供 shell 的 PID。

但是,可以通过几种方式使其变得更复杂。你可以运行其他运行的 shell ls。例如:

sh -c "ls"

在这种情况下,父进程是的 PID sh,因为它有执行完成后,您将无法通过pstree或查看其PID ps

解决方案可以运行如下命令:

sh -c 'echo $$; ls'

请注意使用单引号来避免$$被转义。

但是,也许ls不会由 shell 运行,而是可能由另一个应用程序运行(也许vi,也许是某些 Python 脚本)。

在这种情况下,是的,按照其他现有答案。然而,就目前情况而言,现有脚本无法处理嵌套执行。例如,运行:

sh -c "./myls"

使用该脚本将导致匹配的父进程——该sh行本身和带有的子进程/bin/bash ./myls。您只需ps -ef在脚本顶部添加即可查看更多信息。

我认为一个简化的、更准确的版本应该是:

#!/bin/bash
echo $PPID
ls

它使用内置的 shell 变量$PPID来报告脚本的父进程,并将得出脚本本身的真正父进程。

最后一个需要注意的极端情况是……

sh -c "exec ./myls"

将要不是sh报告其父进程的 PID ,因为从技术上讲不是.myls剧本将有被取代 sh通过使用命令,这意味着 PPID再次exec是调用 shell 的 PPID( )。echo $$

答案2

尝试使用小脚本和别名的解决方法。该脚本将替换您要查找其父进程的命令。脚本名称将隐藏在别名后面。

1.新脚本(例如myls)位于/usr/local/bin并被修改sudo chmod +x myls

#!/bin/bash
NAME=$(basename -- $0)
ps -ef | grep "$NAME" | grep -v grep | awk '{ print "** PARENT PROCESS = " $3; }'
ls

重要提示:仅使用与任何进程和命令名称不同的唯一脚本名称。

2.ls为创建别名myls

alias ls=myls

3.使用ls命令(实际上你将启动myls命令):

ls

4.结果

虚假命令响应的示例ls,其中:

  • 第一行包含父进程号(8481),
  • 第二行和下一行是脚本ls末尾命令的响应myls
myname@mypc:/$ ls
** PARENT PROCESS = 8481
bin   cdrom  dev  fasthome  kdiskmark  libx32  lib64  mnt  proc  run   snap  sys  tmp  var
boot  data   etc  home      lib        lib32   media  opt  root  sbin  srv   s2   usr  vm
myname@mypc:/$ 

这只是简化的解决方案,仅供参考。对于实际使用,脚本应该更精确地自动执行手动任务,例如,ls在脚本末尾放置或类似命令、创建/删除别名...

相关内容