から継承するすべてのプロセス(子、孫など)のリストを取得したいと思います$pid
。これが私が思いついた最も簡単な方法です。
pstree -p $pid | tr "\n" " " |sed "s/[^0-9]/ /g" |sed "s/\s\s*/ /g"
完全なリストを取得するコマンドや簡単な方法はありますか?みんな子孫プロセス?
答え1
次のコマンドは少し簡単で、コマンド名の数字を無視できるという利点があります。
pstree -p $pid | grep -o '([0-9]\+)' | grep -o '[0-9]\+'
またはPerlを使用してください。
pstree -p $pid | perl -ne 'print "$1\n" while /\((\d+)\)/g'
私たちはかっこ内の数字を探しているので、それに会ったときにサブプロセスとして2が与えられませんgif2png(3012)
。ただし、コマンド名に角かっこを含む数字が含まれていると、すべて失敗します。テキスト処理は多くの役に立ちます。
だから私もプロセスグループが行く道だと思います。プロセスを独自のプロセスグループで実行するには、Debianパッケージ「daemontools」の「pgrphack」ツールを使用できます。
pgrphack my_command args
またはPerlを再利用することもできます:
perl -e 'setpgid or die; exec { $ARGV[0] } @ARGV;' my_command args
ここで注目すべき唯一のことは、プロセスグループが入れ子にならないことです。したがって、プロセスが独自のプロセスグループを作成すると、その子プロセスは作成されたグループに含まれなくなります。
答え2
descendent_pids() {
pids=$(pgrep -P $1)
echo $pids
for pid in $pids; do
descendent_pids $pid
done
}
答え3
正確性の問題もある。出力を素早く解析pstree
さまざまな理由で問題があります。
- pstree ショー PIDそしてスレッドのID(名前は中括弧内に表示されます)
- コマンド名には中かっこ、括弧内に数字が含まれているため、安定した解析ができない場合があります。
Pythonがありますpsutil
パッケージをインストールしたら、このコードスニペットを使用してすべての子プロセスを一覧表示できます。
pid=2235; python3 -c "import psutil
for c in psutil.Process($pid).children(True):
print(c.pid)"
(たとえば、psutilパッケージはtracer
Fedora / CentOSで利用可能なコマンドの依存関係としてインストールされます。)
または、Bourne シェルでプロセスツリーの幅優先順位を実行することもできます。
ps=2235; while [ "$ps" ]; do echo $ps; ps=$(echo $ps | xargs -n1 pgrep -P); \
done | tail -n +2 | tr " " "\n"
pidの転移的閉鎖を計算するには、尾を省略できます。
上記のコードは再帰を使用せず、ksh-88でも実行されます。
Linuxでは、以下を削除できます。pgrep
電話して次の情報を読んでください/proc
。
ps=2235; while [ "$ps" ]; do echo $ps ; \
ps=$(for p in $ps; do cat /proc/$p/task/$p/children; done); done \
| tr " " "\n"' | tail -n +2
これは、各PIDの分岐/実行を保存し、各呼び出しpgrep
に対して追加の操作を実行するため、より効率的です。
答え4
私が見つけた最も短いバージョンは、次のコマンドも正しく処理しますpop3d
。
pstree -p $pid | perl -ne 's/\((\d+)\)/print " $1"/ge'
コマンドに次のような奇妙な名前があると、my(23)prog
誤って処理されます。