我用来ps -eo ppid,pid,cmd
查看所有进程,如何格式化输出以如下所示查看?
只有给定的 PID 及其祖先才会打印(直到 init)。
23464 current
|
23211 bash
|
23210 sshd: xxW
|
23193 sshd: WWcccv
|
728 /usr/sbin/sshd –D
|
1 init
我正在编写一个脚本来使用 PID 查看祖先进程,而不使用pstree
,如果可能的话。
答案1
也许是这样的:
#! /bin/bash -
pid=${1?Please give a pid}
sep=
while
[ "$pid" -gt 0 ] &&
read -r ppid name < <(ps -o ppid= -o args= -p "$pid")
do
printf "$sep%$((3+${#pid}/2))d%$((4-${#pid}/2))s%s\n" "$pid" "" "$name"
sep=$' |\n'
pid=$ppid
done
这使:
$ that-script "$$"
13612 /bin/zsh
|
4137 SCREEN screen -xRS main
|
4136 screen screen -xRS main
|
4130 zsh
|
4128 xterm
|
1 /sbin/init splash
这有点慢,因为它ps
在祖先中每个进程运行一个。您可以通过运行ps
一次检索所有信息并对其进行后处理来改进它,awk
例如:
#! /bin/sh -
pid=${1?Please give a pid}
ps -Ao pid= -o ppid= -o args= |
awk -v p="$pid" '
{
pid = $1; ppid[pid] = $2
sub(/([[:space:]]*[[:digit:]]+){2}[[:space:]]*/, "")
args[pid] = $0
}
END {
while (p) {
printf "%s%*d%*s%s\n", sep, 3+length(p)/2, p, 4-length(p)/2, "", args[p]
p = ppid[p]
sep = " |\n"
}
}'
答案2
使用 pstree -spa 怎么样?它将显示给定 pid 的前辈和祖先,包括 pid 和命令行。
$ pstree -spa 3056
systemd,1
└─upowerd,3056
├─{gdbus},3071
└─{gmain},3069
答案3
将 pid、ppid 放入数组中。递归函数或循环遍历数组,仅打印所需的 pid 和 ppid 条目。