この質問は、次の質問に対する後続の質問です。プロセスを一時停止して再開する方法
gnome-terminalのbashセッションでFirefoxを起動しました。
プロセスツリーは次のとおりです。
$ ps -e -o pid,ppid,cmd -H
1828 1 gnome-terminal
26677 1828 bash
27980 26677 /bin/sh /usr/lib/firefox-3.6.15/firefox
27985 27980 /bin/sh /usr/lib/firefox-3.6.15/run-mozilla.sh /usr/lib/firefox-3.6.15/firefox-bin
27989 27985 /usr/lib/firefox-3.6.15/firefox-bin
28012 27989 /usr/lib/firefox-3.6.15/plugin-container /usr/lib/adobe-flashplugin/libflashplayer.so 27989 plugin true
Bash をクリックするとCTRL+Z
Firefox が一時停止します。コマンドbg
(または)を実行すると、fg
Firefoxが復元されます。これは期待どおりに機能します。
他の端末でコマンドを実行すると、最初の端末にその行が印刷されますがkill -s SIGTSTP 27980
([1]+ Stopped firefox
クリックしたときと同じようにCTRL+Z
)Firefoxは一時停止しません。私はシェルスクリプトを一時停止すると思います。
kill -s SIGTSTP 27989
他の端末(PIDを参照)でコマンドを実行すると、Firefoxは一時停止します。最初の端末はこれを認識しませんでした。
Bashでプロセスツリー全体を歩くには?ツリーを巡回し、すべての子ノードに SIGTSTP シグナルを送信します。
答え1
シェル操作はプロセスグループに存在し、PGRP
拡張出力ps
の列を表示します。これは、ジョブ制御と端末(実際または個人)を「所有」する人を決定するために使用されます。
POSIX(System Vから取得)は、プロセスグループがグループの最初のプロセス(「プロセスグループリーダー」)によって識別されるため、負のプロセスIDを使用してプロセスグループを表します。したがって、を使用してps
プロセスグループを決定し、次に使用しますkill -s TSTP "-$pgrp"
。 (努力していますps -u"$USER" -opid,ppid,pgrp,cmd
。)
プロセスツリーでは、プロセスグループはfirefox
スクリプトの開始から始まるため、bash
プロセスグループは27980で、コマンドはですkill -s TSTP -27980
。
もちろん、プロセスグループを復元するにはkill -s CONT -- -27980
。