すべてのプロセスを表示するために使用していますps -eo ppid,pid,cmd
。次のように出力形式を指定するにはどうすればよいですか?
与えられたPIDとその親アイテムのみが印刷されます(初期化されるまで)。
23464 current
|
23211 bash
|
23210 sshd: xxW
|
23193 sshd: WWcccv
|
728 /usr/sbin/sshd –D
|
1 init
pstree
可能であれば、PIDを使用せずにPIDを使用して親プロセスを表示するスクリプトを作成しています。
答え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
祖先はプロセスごとに1つずつ実行されるため、少し遅くなります。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エントリのみを印刷します。