スクリプトの末尾にループがあると、Bash `&`は一貫して動作しません。

スクリプトの末尾にループがあると、Bash `&`は一貫して動作しません。

Linux Mint 19を起動するときにいくつか実行したいと思います。したがって、MATE端末ウィンドウでscript()を使用して一度にすべて実行しました./get-to-work

chromium-browser --start-maximized &
thunderbird &
code -n path/to/my/workspace &

良い結果。スクリプトを起動してターミナルウィンドウを閉じましたが、3つのプログラムが実行され続けました。

しかし、最近は5分ごとに大きな黄色い窓を開く行を追加しました(まっすぐ座るように思い出させるため)。

chromium-browser --start-maximized &
thunderbird &
code -n path/to/my/workspace &
for i in {1..1000}; do sleep 300 ; xterm -bg yellow -g 240x80 ; done

このスクリプトを起動した端末を閉じると、スクリプトはまだ実行中で終了し、黄色のポップアップは表示されません。これは実際に私の機能です。ポップアップがポップアップしたいときに端末を開いたままにしてから、画面を共有するときに閉じます。

ただし、何らかの理由で端末を閉じてスクリプトを終了すると、ポップアップループが停止するだけでなく、ChromiumとThunderbirdも閉じます。 VSCode(code)は開いたままです。なぜ?

答え1

最初のケースではどうなりますか?

スクリプトを実行するシェルは、スクリプトの最後のコマンドがバックグラウンドに切り替えられた直後に終了します。シェルプロセスは、スクリプトから起動された3つのプログラムの親プロセスです。これで親プロセスが終了したため、PID-1プロセス(initまたはsystemd今はしばしば終了)が親プロセスになります。

ターミナルプログラムはもはや(グランド)親プロセスではないので、ターミナルとスクリプトから始まるプログラム間のリンクは消えます。

2番目のケースではどうなりますか?

最後のバックグラウンドプロセスの後、スクリプトはアクティブのままでループを実行します。端末が終了すると、SIGHUP を子プロセスに送信します。シェルは子プロセスとして、この信号を子プロセス(プログラム)に伝播します。

プロセスがHUP信号を受信したときの基本的な作業は終了です。明らかに、 VSCodeSIGHUPは無視されたりfork()親プロセスを離れたりするため、影響を受けません。

関連情報