ログアウト時にSIGHUPがジョブに送信されないのはどの場合ですか?


10

実行していると主張したユーザーからの回答を読んだ

foo 2>&1 >& output.log &

fooログアウトした場合でも、実行が継続されます。このユーザーによると、これはSSH接続でも機能しました。

SSHから切断したり、TTYを終了したりすると、シェルとそのプロセスがSIGHUPを受信して​​終了するという印象を受けたので、本当に信じていませんでした。これは、私の仮定の下で、使用するための唯一の理由だったnohupような場合に、またはtmuxscreenら。

次に、glibcのマニュアルを調べました。

このシグナルは、端末の制御プロセスの終了を、そのセッションに関連付けられたジョブに報告するためにも使用されます。この終了により、セッション内のすべてのプロセスが制御端末から効果的に切断されます。

これは私の考えを裏付けるようです。しかしさらに見ると、それは言う

プロセスが制御端末を持つセッションリーダーである場合、SIGHUP信号がフォアグラウンドジョブの各プロセスに送信され、制御端末はそのセッションから切り離されます。

では、これはバックグラウンドで実行されたジョブがSIGHUPを受け取らないことを意味しますか?

さらに混乱して、対話型のZshセッションを実行しyes >& /dev/null &、をexit実行して入力しexitました。Zshがジョブを実行していることを警告し、もう一度入力した後、1つのジョブをSIGHUPしたことを通知しました。Bashでまったく同じことを行うと、ジョブが実行されたままになります…


過去にsshを介して突然切断されたサーバーに問題があり、プロセスが実行され続けたがttyが関連付けられていないため、再度ログインし、SIGHUP / TERM / KILLを送信してそれらを終了する必要がありました。したがって、同じロジックに従って、私はたった今テストし、入力しlogoutyesまだ実行しています。
Braiam 2013

SIGHUPが送信されるかどうかに加えて、プロセスがシグナルハンドラー(およびSIGHUPをキャッチ)またはシグナルマスクを定義したかどうかは、そのシグナルの送信時に終了するかどうかの追加の要素です。それはログアウト後に実行したままだから、という理由だけで、それはその信号送信されませんでしたという意味ではありません
ティム・B

この質問を参照していますか:serverfault.com/questions/115999/…?答えはそこにあるようです-それはRedHatがデフォルトでshoptを設定していないためです。RedHatの特定の設定の癖です。
Boris Burkov 2013

@ボブいいえ、私はこれを見たことがありませんが、良いリソースです。ありがとう!
slhck 2013

それが助けてうれしい。実際、ラファエルはその問題についても言及しています。
Boris Burkov 2013

回答:


18

Bashは、SIGHUP自分がを受信した場合にのみ送信するようですSIGHUP。これは、たとえば、仮想端末が閉じられたとき、またはSSH接続が中断されたときに発生します。ドキュメントから:

デフォルトでは、シェルはSIGHUPを受信すると終了します。終了する前に、対話型シェルは実行中または停止中のすべてのジョブにSIGHUPを再送信します。停止したジョブにはSIGCONTが送信され、SIGHUPを確実に受信します。シェルが特定のジョブにSIGHUPシグナルを送信しないようにするには、disown組み込み(ジョブ制御組み込みを参照)でジョブテーブルから削除するか、disown -hを使用してSIGHUPを受信しないようにマークを付ける必要があります。

したがって、タイプするexitCtrl+を押すと、Dすべてのバックグラウンドプロセスが残ります。これは、ハングアップ信号をBashに送信しないためです。

Bashに、実行中のバックグラウンドプロセスがまだあるという事実を警告するように強制できます。

shopt -s checkjobs

SIGHUP対話型シェルを使用している場合は、終了時にon を送信するオプションがあります(ここを参照)。しかし、Bash 4.2.25がインストールされている私のマシンでは動作しません。多分それはあなたのために働く

shopt -s huponexit

それで、SSH接続が中断したときにSIGHUP送信されます。そうでない場合、正常に終了すると、ジョブは引き続き実行されますか?それは私が見たものを説明しています。
slhck 2013

はい。ハングアップ信号は、ユーザーとの接続が中断された場合にのみ発生します。
Raphael Ahrens 2013



@npostavs回答に追加した情報に感謝します。
Raphael Ahrens、2015年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.