假设我们有一个进程的 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
。