我已经阅读了确定正在运行的进程的父进程的方法,但是如果进程的生命周期太短,无法运行 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
在脚本末尾放置或类似命令、创建/删除别名...