/etc/init.d/ 中的哪个脚本启动了该过程?

/etc/init.d/ 中的哪个脚本启动了该过程?

假设我们有一个进程的 PID,并且我们知道它是在启动过程中由 init 启动的。我们如何找到启动它的脚本名称?

一种方法是运行grep $PROCESS_NAME /etc/init.d/*,但该解决方案既不是万无一失的,也不是非常优雅。

另一种方法是运行service --status-all,其中一个服务很有可能返回 PID,但这比前一种解决方案更不优雅

编辑:

操作系统是RedHat/Ubuntu。

假设我们有 sshd 以 PID 2083 运行,如下所示:

UID        PID  PPID  C STIME TTY          TIME CMD
root      2083     1  0  2012 ?        00:00:00 /usr/sbin/sshd -D

它的父母是init和我猜测它是在启动过程中使用命令启动的service sshd start,但如果我们有一些不容易猜到的东西,例如复杂的启动命令或由于混淆的/etc/init.d/somedeamon脚本 - 我们如何somedeamon在只知道 PID 的情况下找到脚本?

答案1

向后追踪 PPID 链的一个简单方法是使用以下pstree工具:

pstree -p PID

这将显示指定PID的所有父进程,例如:

$ pstree 42284
-+= 00001 root /sbin/launchd
 \-+= 00199 jack /sbin/launchd
   \-+= 00254 jack /Applications/iTerm.app/Contents/MacOS/iTerm -psn_0_90134
     \-+= 00309 root login -fp jack
       \-+= 00310 jack -bash
         \--= 42284 jack vim site.txt

答案2

您应该能够从您感兴趣的进程向后跟踪 PPID 链。但是,如果 A 启动了 B,B 启动了 C,并且 B 完成了,那么现在 C 的父进程是init(PID 1)。要访问有关进程 PID 的信息,您需要执行ps -l -pPID

相关内容