プロセスを一時停止しましたkill -TSTP <pid>
。それから続けてみてくださいkill -CONT <pid>
。ただし、プロセスが完了した後、コントロールはbashに返されません。なぜこれが起こるのですか?そして、この問題をどのように克服できますか?
bash(例:bash-1)で始まります./name.sh
。次に、kill -TSTP <pid>
bash-2を介してコマンドを使用してプロセスを一時停止します。最後に、kill -CONT <pid>
bash-2で復元しようとしました。しかし、シェルスクリプトが完了した後、制御は返されず、永久にそのまま残ります。
答え1
シェルから開始されたプロセスには制御 TTY が接続され、シェルから継承され、プロセスグループにも属します。 ' を使用してパイプで複数のプロセスを実行する場合、または ' を使用してサブシェル表記を使用する|
場合、そのプロセスはすべて同じプロセスグループで開始されます。()
ユーザーが一時停止キーを押すと、通常Ctrl-Zキーボードでは、TTYレイヤはSIGTSTP
現在のフォアグラウンドプロセスグループ内のすべてのプロセスにシグナルを送信し、親シェルは呼び出しを介して目覚めたり、呼び出しSIGCHLD
から返されてwait()
TTYを再処理します。シェルはTTYを制御し、シェル自体が独自のプロセスグループに常駐するため、フォアグラウンドのプロセスグループを制御することを担当します。
プロセスが TTY の現在のフォアグラウンド・プロセス・グループの一部ではない場合、TTY レイヤーはSIGTTIN
端末からデータを読み取ろうとすると自動的にプロセスを停止し、メッセージを表示します。たとえば、SIGCONT
vimなどの対話型テキストエディタに送信すると復元されますが、キーボードから次のキーを押すためにSIGTTIN
呼び出さread()
れるとすぐに 。ジョブ制御ガイドラインを使用して、シェルがfg
フォアグラウンドにないことを再開する前に、vimをフォアグラウンドプロセスグループに移動する必要があることをシェルに通知する必要があります。
答え2
kill -CONT
シェルが理解できないのです。
したがって、シェルに影響を与えずにプロセスを続行します。
これにより、バックグラウンドプロセスと同様の結果が得られます。
プロセスを続行するには、電話することをお勧めしますfg
。または、これが「現在のジョブ」ではない場合は、jobs
すべての現在のジョブのリストを使用してから電話してください(たとえば、fg %3
関連ジョブがジョブ#3の場合)。
kill -CONT
シェルを呼び出すこととシェルを起動することの違いは、fg
使用時にfg
シェルがシグナルを送信することに加えて、SIGCONT
ttyプロセスグループを再開プロセスのグループに設定することです。 ttyプロセスグループの設定は、信号の自動転送を制御しますTSTP
。その後、シェルはコマンドを待機し始めます。TTIN
TTOU
ただし、kill -CONT
問題のプロセスを実行しているシェル/ttyとは異なるシェル/ttyから呼び出す場合は、明らかに外部プロセスの実行を続けることです。トリガーされたシェルはkill -CONT
プロンプトに戻りますが、それを見ることができます。