Bashスクリプトがありますscript1
。
#! /bin/bash
evince
そして別のスクリプトscript2
#! /bin/bash
evince &
私が走るとき
./script2
bashプロセスはevince
バックグラウンドに入った直後に終了し、evince
プロセスは引き続き実行されます。
私が走るとき
./script1 &
bashプロセスがevince
実行が完了するのを待っています。
私がbashプロセスの場合、kill
bashプロセスは終了し、プロセスは終了しますevince
。
evince
bashプロセスの終了が2番目のスクリプトのプロセスには影響しませんが、最初のスクリプトのプロセスに影響を与える理由を知りたいです。
fork(), exit()
などのシステムコールに関して説明できますかwait()
?
ありがとうございます。
これは以下に関連しています。バックグラウンドで実行されるこのスクリプトがシェルを "kill" 呼び出して終了しても生き残ることができるのはなぜですか。しかし、ここでは基本的な一般的なケースを学びたいです。
答え1
シェルだけを終了した場合は、bashに関するバグレポートを送信する必要があります。
最新のシェルはインタラクティブシェルのジョブ制御を自動的に有効にするため、
./script1&
独自のプロセスグループIDを使用して新しいタスクを作成します。
evince
次を呼び出すと、シェルはプログラムを待ちます。
kill -9 $!
シェルのみがシャットダウンされ、引き続きevince
実行されます。
しかし、電話する場合:
kill %1
これにより、を含むすべての操作が終了しますevince
。