
これは、Bash に関する質問というよりは、プロセス管理/シグナル処理に関する質問です。問題を説明するために Bash を使用しているだけです。
バックグラウンド プロセスを実行する Bash スクリプトを実行しています。スクリプトは次のとおりです。
#!/bin/bash
# ...
# The background process
{
while :; do
sleep 1 && echo foo >> /path/to/some/file.txt
done
} &
# ...
exit 0
スクリプト自体はバックグラウンドで実行しません。単に./script
.
「huponexit」シェル オプションは を使用して有効にされているshopt -s huponexit
ため、ターミナルが閉じられるときに、Bash に HUP 信号が送信され、バックグラウンド プロセスに到達するまでその信号が伝播されるものと予想されます。バックグラウンド プロセスがtrap
信号を無視しない場合は、そのプロセスも強制終了されますが、これは発生しません。バックグラウンド プロセスは、 が実行されたかのように動作しますdisown
。
これは、問題を説明するために私が描いた図です。この図と上記の説明は、私がこの問題を十分に理解していないため、間違っている可能性があります。本当にそうであれば、その点を指摘してください。
次のように対話型シェルによって呼び出されたかのように、ターミナルを閉じた後にバックグラウンド プロセスが終了されない理由を知りたいです。
rany@~/Desktop$ while :; do sleep 1 && echo foo >> /path/to/some/file.txt; done &
よく分かりませんが、私の質問に対する答えは、Bash がスクリプトを実行するために非対話型シェルを fork() し、ジョブ制御とシグナル処理のルールが異なる可能性があるという事実にあると思います。
答え1
では、マニュアルページには何が書いてあるのでしょうかhuponexit
?
huponexitシェルオプションがshoptで設定されている場合、bashはすべてのジョブにSIGHUPを送信します。インタラクティブログインシェルが終了します。
編集: これはログイン シェルであることを強調します。
編集2: インタラクティブ性も同様に重視するべきである