同僚との長い議論の後にこれを尋ねて、私はここで明確化をお願いします。
コマンドラインに "&
"を追加するか、CTRL-Z
で停止してバックグラウンドで "bg
"で再開することにより、バックグラウンドプロセスを起動します。次にログアウトします。
何が起こるのですか?
SIGHUPによって強制終了されるべきであると確信していましたが、これは起こりませんでした。再度ログインすると、プロセスは問題なく実行され、pstree
はinit
によって「採用」されたことを示しました。
これは予想される動作ですか?
しかし、もしそうなら、Nohup
コマンドの目的は何ですか?とにかく、プロセスの有無にかかわらず、プロセスが強制終了されることはないようです...
さらに詳細:
Nohup
および/または&
;その後、CTRL-Z
で中断され、bg
でバックグラウンドで再開されました。exit
"コマンド)。scp
ファイルのコピー操作でした。pstree
は、プロセスが実行中でinit
の子であることを示しました。質問をより明確に述べると、プロセスをバックグラウンドで(&
またはbg
を使用して)実行すると、SIGHUP
コマンドと同様に、Nohup
が無視されますか?
手動でSIGHUP
をscp
に送信しようとしました:終了したので、信号は無視されません。
次に、もう一度起動してバックグラウンドに置き、ログオフしました。init
によって「採用」されて実行を続けたところ、再度ログオンしたときにそこで見つかりました。
私は今かなり困惑しています。ログオフ時にSIGHUP
がまったく送信されなかったようです。
回答が見つかりました。
BASHの場合、これはhuponexit
シェルオプションに依存します。これは、組み込みshopt
コマンドを使用して表示または設定できます。
少なくともRedHatベースのシステムでは、このオプションはデフォルトでオフになっているようです。
デフォルトでは、シェルはSIGHUPを受信すると終了します。終了する前に、対話型シェルは実行中または停止中のすべてのジョブにSIGHUPを再送信します。停止したジョブはSIGCONTに送信され、SIGHUPを確実に受信します。シェルが特定のジョブにシグナルを送信しないようにするには、disownビルトイン(下記のシェルビルドコマンドを参照)を使用してジョブテーブルから削除するか、disown -hを使用してSIGHUPを受信しないようにマークを付ける必要があります。
Huponexitシェルオプションがshoptで設定されている場合、bashは対話型ログインシェルが終了すると、すべてのジョブにSIGHUPを送信します。
私はワーナーに同意し、シェルが組み込みの「disown」コマンドでSIGHUPを送信しないようにできることを追加したいと思います。 bashのmanページに適切な説明が含まれています。
コマンドNohupを使用してコマンドを起動し、出力をNohup出力ファイルにリダイレクトできます。 Nohupのmanページから:
Nohup - run a command immune to hangups, with output to a non-tty
他のオプションはscreenコマンドを使用することです。 screenを使用する利点は、後でプロセスに再接続できることです。
プロセスをバックグラウンドにフォークしても、それはシェルが実行している子プロセスのままです。
シェルで実行されているすべての子プロセスには、終了時にSIGHUPが送信されます。パフォーマンスは、bashのマンページで詳細に説明されている正確な状況によって多少異なります。他のシェルにも同様の説明があります。
Apacheおよびその他のデーモンは、通常、SIGHUPで構成を再ロードします。ユーザースペースユーティリティはしばしば死にます。信号にリンクされたアプリケーションのパフォーマンスは、アプリケーションに固有である可能性があります。
プロセスは何でしたか?以前の投稿で説明されているパフォーマンス 1 は正確でした。
特定のスクリプト関数とプロセスがシグナルをトラップする可能性があります。一方、ループは狂ったように逃げることができます。
見る:
編集1 4:22 PM
Bashのマンページから:
The Shell exits by default upon receipt of a SIGHUP. Before exiting,
an interactive Shell resends the SIGHUP to all jobs, running or
topped.
最初の調査 1 は、OpenSSHがおそらくSIGHUPを無視することを示しています。