実行していると主張したユーザーからの回答を読んだ
foo 2>&1 >& output.log &
foo
ログアウトした場合でも、実行が継続されます。このユーザーによると、これはSSH接続でも機能しました。
SSHから切断したり、TTYを終了したりすると、シェルとそのプロセスがSIGHUPを受信して終了するという印象を受けたので、本当に信じていませんでした。これは、私の仮定の下で、使用するための唯一の理由だったnohup
ような場合に、またはtmux
、screen
ら。
次に、glibcのマニュアルを調べました。
このシグナルは、端末の制御プロセスの終了を、そのセッションに関連付けられたジョブに報告するためにも使用されます。この終了により、セッション内のすべてのプロセスが制御端末から効果的に切断されます。
これは私の考えを裏付けるようです。しかしさらに見ると、それは言う:
プロセスが制御端末を持つセッションリーダーである場合、SIGHUP信号がフォアグラウンドジョブの各プロセスに送信され、制御端末はそのセッションから切り離されます。
では、これはバックグラウンドで実行されたジョブがSIGHUPを受け取らないことを意味しますか?
さらに混乱して、対話型のZshセッションを実行しyes >& /dev/null &
、をexit
実行して入力しexit
ました。Zshがジョブを実行していることを警告し、もう一度入力した後、1つのジョブをSIGHUPしたことを通知しました。Bashでまったく同じことを行うと、ジョブが実行されたままになります…
logout
、yes
まだ実行しています。