shell -- 已知进程pid获取其父进程pid、祖父进程pid...

脚本示例

直接上脚本,根据当前进程PID,逐级向上查找当前进程的父进程

x86环境:

#!/bin/bash

count=0
pid=$$

while true
do
get_ppid=$(ps -elf |awk '$4=='$pid'{print $5}')
ppid=$get_ppid
count=$(expr $count + 1)
echo "level[$count] pid[$pid], ppid[$ppid]"
if [ $ppid == 1 ]; then
    break;
else
    pid=$ppid
fi
done

arm环境:

#!/system/bin/sh

count=0
pid=$$

while true
do
get_ppid=$(ps |awk '$2=='$pid'{print $3}')
ppid=$get_ppid
count=$(expr $count + 1)
echo "level[$count] pid[$pid], ppid[$ppid]"
if [ $ppid == 1 ]; then
    break;
else
    pid=$ppid
fi
done

通过这份脚本,可以逐级向上查找当前进程的父进程。

打印如下:

zhugeyifan@DriverTeam:~/$ ./get_ppid.sh 
level[1] pid[27817], ppid[131152]
level[2] pid[131152], ppid[131151]
level[3] pid[131151], ppid[131095]
level[4] pid[131095], ppid[1676]
level[5] pid[1676], ppid[1]

脚本解析

整个原理就是,先获取当前的进程PID,然后根据“ps -elf”的命令,可以打印出对应PID进程的父进程,再以该父进程作为参数,继续通过“ps -el”命令获取更下一级的父进程。一直循环,直到父进程为1(1是系统init进程,是所有进程的父进程)。

注意事项

上述的脚本并不一定是所有系统环境下通用的,原因是“ps”命令在有的x86上需要“-elf”等参数,但在嵌入式系统中,可能不是这个参数,或者不需要传参等等。

x86环境:
zhugeyifan@DriverTeam:~/$ ps -elf
F S UID         PID   PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD
4 S root          1      0  0  80   0 -  8511 -       7月22 ?      00:00:03 /sbin/init
1 S root          2      0  0  80   0 -     0 -       7月22 ?      00:00:00 [kthreadd]
1 S root          3      2  0  80   0 -     0 -       7月22 ?      00:00:01 [ksoftirqd/0]
...

arm环境:
root@kedacom:/ # ps
USER     PID   PPID  VSIZE  RSS     WCHAN    PC        NAME
root      1     0     8868   740   c012f7c4 00036098 S /init
root      2     0     0      0     c003e394 00000000 S kthreadd
root      3     2     0      0     c0041848 00000000 S ksoftirqd/0
...

还有“awk '$4=='$pid'{print $5}'”中的参数$4和$5,这个位置是根据所谓“间隔”数来定的。

在x86下,我们想要获取到PPID对应的值,总共有4次空格间隔开来,所以传参$4和$5

在arm下,我们想要获取到PPID对应的值,总共有2次空格间隔开来,所以传参$2和$3

x86环境:
zhugeyifan@DriverTeam:~/$ ps -elf |awk '$4=='3'{print $5}'
2

arm环境:
130|root@kedacom:/ # ps |awk '$2=='3'{print $3}'     
2

猜你喜欢

转载自blog.csdn.net/Ivan804638781/article/details/107822615