bashのようにプロセスを中断および再開する方法


13

この質問はフォローアップです:プロセスを中断および再開する方法

私は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

CTRL+Zbashでヒットすると、firefoxが中断されます。コマンドbg(またはfg)を発行すると、firefoxが再開されます。これは予想どおりです。

kill -s SIGTSTP 27980別のターミナルでコマンドを発行する[1]+ Stopped firefoxと、最初のターミナルで行を印刷します(ちょうどヒットしたときのようにCTRL+Z)が、firefoxを中断しません。シェルスクリプトを一時停止するだけだと思います。

kill -s SIGTSTP 27989別の端末でコマンド(PIDに注意)を発行すると、firefoxが中断されます。最初の端末はこれに注意しません。

bashはプロセスツリー全体をどのように一時停止しますか?ツリーとすべての子をSIGTSTPだけトラバースしますか?



@geekosaurが話しているプロセスグループを表示するpgidには、psコマンドに追加する必要があります。
-ninjalj

回答:


17

シェルジョブは「プロセスグループ」に存在します。PGRP拡張ps出力の列を見てください。これらは、ジョブ制御と端末の「所有」者(実またはpty)の判別の両方に使用されます。

プロセスグループはグループ内の最初のプロセス(「プロセスグループリーダー」)によって識別されるため、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ます。


7
ところで、 bashSIGTSTPあなたが入力するときはそうはありません^Z; 以降firefoxのプロセス・グループが端末の現在のプロセスグループであり、端末ドライバ(pedantically、ライン規律)が送信SIGTSTPそのプロセスグループ内のすべてのプロセスに。 bashちょうどされwaitpid()、それにINGの(および任意の他のジョブ)。などの他の端末の信号、^Cおよび^\ 同じように動作します。(メタ:SEはそのctrl-backslash ..を嫌います。)
ギコサウルス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.