web-dev-qa-db-ja.com

バックグラウンドプロセスを起動してログアウトした場合、引き続き実行されますか?

同僚との長い議論の後にこれを尋ねて、私はここで明確化をお願いします。

コマンドラインに "&"を追加するか、CTRL-Zで停止してバックグラウンドで "bg"で再開することにより、バックグラウンドプロセスを起動します。次にログアウトします。

何が起こるのですか?

SIGHUPによって強制終了されるべきであると確信していましたが、これは起こりませんでした。再度ログインすると、プロセスは問題なく実行され、pstreeinitによって「採用」されたことを示しました。

これは予想される動作ですか?

しかし、もしそうなら、Nohupコマンドの目的は何ですか?とにかく、プロセスの有無にかかわらず、プロセスが強制終了されることはないようです...


編集1

さらに詳細:

  • コマンドは、物理コンソールからではなく、SSHセッションから起動されました。
  • コマンドが起動されましたなしNohupおよび/または&;その後、CTRL-Zで中断され、bgでバックグラウンドで再開されました。
  • Sshセッションしませんでしたドロップ。実際のログアウトがありました( "exit"コマンド)。
  • プロセスはscpファイルのコピー操作でした。
  • 再度ログインすると、pstreeは、プロセスが実行中でinitの子であることを示しました。

編集2

質問をより明確に述べると、プロセスをバックグラウンドで(&またはbgを使用して)実行すると、SIGHUPコマンドと同様に、Nohupが無視されますか?


編集3

手動でSIGHUPscpに送信しようとしました:終了したので、信号は無視されません。

次に、もう一度起動してバックグラウンドに置き、ログオフしました。initによって「採用」されて実行を続けたところ、再度ログオンしたときにそこで見つかりました。

私は今かなり困惑しています。ログオフ時にSIGHUPがまったく送信されなかったようです。

29
Massimo

回答が見つかりました。

BASHの場合、これはhuponexitシェルオプションに依存します。これは、組み込みshoptコマンドを使用して表示または設定できます。

少なくともRedHatベースのシステムでは、このオプションはデフォルトでオフになっているようです。

BASH manページの詳細情報

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

Huponexitシェルオプションがshoptで設定されている場合、bashは対話型ログインシェルが終了すると、すべてのジョブにSIGHUPを送信します。

21
Massimo

私はワーナーに同意し、シェルが組み込みの「disown」コマンドでSIGHUPを送信しないようにできることを追加したいと思います。 bashのmanページに適切な説明が含まれています。

7
Kim

コマンドNohupを使用してコマンドを起動し、出力をNohup出力ファイルにリダイレクトできます。 Nohupのmanページから:

Nohup - run a command immune to hangups, with output to a non-tty

他のオプションはscreenコマンドを使用することです。 screenを使用する利点は、後でプロセスに再接続できることです。

4
Jim

プロセスをバックグラウンドにフォークしても、それはシェルが実行している子プロセスのままです。

シェルで実行されているすべての子プロセスには、終了時にSIGHUPが送信されます。パフォーマンスは、bashのマンページで詳細に説明されている正確な状況によって多少異なります。他のシェルにも同様の説明があります。

Apacheおよびその他のデーモンは、通常、SIGHUPで構成を再ロードします。ユーザースペースユーティリティはしばしば死にます。信号にリンクされたアプリケーションのパフォーマンスは、アプリケーションに固有である可能性があります。

2
Warner

プロセスは何でしたか?以前の投稿で説明されているパフォーマンス 1 は正確でした。

特定のスクリプト関数とプロセスがシグナルをトラップする可能性があります。一方、ループは狂ったように逃げることができます。

見る:

SSHセッションドロップ-コマンドは実行を継続しますか?

編集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を無視することを示しています。

0
Warner