これは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
端末が閉じたときにHUP信号をBashに送信してバックグラウンドプロセスに到達するまで伝播したいと思います。バックグラウンドプロセスがシグナルを無視してtrap
シグナルを無視すると、そのプロセスも終了しますが、これは発生しません。バックグラウンドプロセスはdisown
「ed」のように動作します。
これはこの問題を説明するために私が描いた計画です。上記の説明とスキームは、私がそのトピックを十分に理解していなかったため、間違っている可能性があります。これが本当なら、この問題を解決するのに役立ちます。
次のようなインタラクティブシェルから呼び出されたように、端末を閉じた後もバックグラウンドプロセスが終了しない理由は疑問に思います。
rany@~/Desktop$ while :; do sleep 1 && echo foo >> /path/to/some/file.txt; done &
わかりませんが、私の質問に対する答えは、Bash fork()がスクリプトを実行する非対話型シェルであり、他の一連のジョブ制御および信号処理ルールがある可能性があることです。
答え1
それでは、マニュアルページは私たちに何を教えますかhuponexit
?
shoptを使用してhuponexitシェルオプションが設定されている場合、bashは次の場合にすべての操作にSIGHUPを送信します。対話型ログインシェルが終了します。
編集:ログインシェルであることを強調しました。
編集2:相互作用も同等の関心を得る価値があります