殺害後に何が起こるか - 続き?

殺害後に何が起こるか - 続き?

プロセスを一時停止しました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端末からデータを読み取ろうとすると自動的にプロセスを停止し、メッセージを表示します。たとえば、SIGCONTvimなどの対話型テキストエディタに送信すると復元されますが、キーボードから次のキーを押すためにSIGTTIN呼び出さread()れるとすぐに 。ジョブ制御ガイドラインを使用して、シェルがfgフォアグラウンドにないことを再開する前に、vimをフォアグラウンドプロセスグループに移動する必要があることをシェルに通知する必要があります。

答え2

kill -CONTシェルが理解できないのです。

したがって、シェルに影響を与えずにプロセスを続行します。

これにより、バックグラウンドプロセスと同様の結果が得られます。

プロセスを続行するには、電話することをお勧めしますfg。または、これが「現在のジョブ」ではない場合は、jobsすべての現在のジョブのリストを使用してから電話してください(たとえば、fg %3関連ジョブがジョブ#3の場合)。

kill -CONTシェルを呼び出すこととシェルを起動することの違いは、fg使用時にfgシェルがシグナルを送信することに加えて、SIGCONTttyプロセスグループを再開プロセスのグループに設定することです。 ttyプロセスグループの設定は、信号の自動転送を制御しますTSTP。その後、シェルはコマンドを待機し始めます。TTINTTOU

ただし、kill -CONT問題のプロセスを実行しているシェル/ttyとは異なるシェル/ttyから呼び出す場合は、明らかに外部プロセスの実行を続けることです。トリガーされたシェルはkill -CONTプロンプトに戻りますが、それを見ることができます。

関連情報