dummy.sh
pid 101と7つの子があるプロセスがあるとします。
pstree -pc 101
dummy(101)──dummy(102)──dummy(103)──dummy(104)──dummy(105)──dummy(106)──sleep(107)
しかし、6つ以上のサブエントリ(私たちの場合はdummy.sh 101)を持つBashスクリプトからすべてのプロセスのPIDを取得するには?私は子プロセスが6より小さいPIDを持つことを望まない。
試しましたが、PS -u myuser
すべてのユーザープロセスのみが表示されます。しかし、子が6より大きいユーザープロセスのPIDを取得する方法は何ですか?
修正する:
たとえば、次の再帰スクリプトを使用して7つの直系の子孫チェーンをトリガーします。 6つ以上の子孫があるので、PID 101を取得したいと思います。
同様に、このダミープロセスはdummy(101)の親になるbash(100)端末によってトリガーされるため、Pid 100も必要です(6つ以上の子を持つ基準も満たすため)。
bash(100)──dummy(101)──dummy(102).....dummy(107)
#!/bin/bash
if [[ "$#" -ne 1 ]]; then
set -- 7
fi
if [[ "$1" -gt 2 ]]; then
echo 'descendant process' "$1"
"$0" "$(($1 - 1))"
else
sleep 500
fi
基準:
私はコマンドによって返されたPIDのみを考えますps -u $USER -o pid
。私の要件は、ユーザーの前処理を検討することです。ユーザープロセスに6つ以上の子があることを確認するためにこれを繰り返します。しかし、私の質問は、特定のPIDの子孫の数を見つける方法です。
ベストアンサー1
これを行うより効率的な方法があると確信していますが、次のように動作します。
#!/bin/bash
declare -A procs
ps -u $USER --no-headers -o pid,ppid | (
# build an associate array that maps pids to parent pids
while read pid ppid ; do
procs[$pid]=$ppid
done
# for each process, walk up the tree, counting processes
for pid in "${!procs[@]}"; do
save_pid=$pid
depth=0
while :; do
ppid=${procs[$pid]}
[[ $ppid ]] || break
let depth++
pid=$ppid
done
if (( depth > 6 )); then
echo $save_pid
fi
done
)