脚本示例
直接上脚本,根据当前进程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