假设我运行ps axf
命令,我能够看到我的进程树如下:
800 ? Ss 0:00 /usr/sbin/sshd
10186 ? Ss 0:00 \_ sshd: yukondude [priv]
10251 ? S 0:00 \_ sshd: yukondude@pts/0
10252 pts/0 Ss 0:00 \_ -bash
10778 pts/0 S 0:00 \_ su -
10785 pts/0 S 0:00 \_ -su
11945 pts/0 R+ 0:00 \_ ps axf
我知道可以使用$$
查看当前shell的PID(10785),或者$PPID
查看父进程的PID(10778)。
但是我只想要顶层父进程的PID,在这个例子中应该是800(SSH守护程序)。有没有简单的方法来做到这一点?
我从这个SO答案中了解到,我可以递归检查/proc/PID/stat
文件中的第四个条目以找到每个进程的父进程PID:
# cut -f4 -d' ' /proc/10785/stat
10778
# cut -f4 -d' ' /proc/10778/stat
10252
# cut -f4 -d' ' /proc/10252/stat
10251
# cut -f4 -d' ' /proc/10251/stat
10186
# cut -f4 -d' ' /proc/10186/stat
800
# cut -f4 -d' ' /proc/800/stat
1
(顶层父PID将是在到达init
的PID之前的最后一个PID,即1。)
在编写一个小循环之前(我甚至不确定在bash中是否可以使用递归),有没有我正在忽略的更为直接的方法?也许是/proc
下的另一个文件参数?通过这些文件进行grep
并没有发现任何明显的东西。
编辑:当然,所有Linux进程的顶级进程都是具有PID 1的/sbin/init。我想要的是在那之前的父进程的PID:倒数第二个父进程的PID。