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


29

同僚との長期にわたる議論の後にこれを尋ねて、私はここで明確化が本当に欲しいです。

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

何が起こるのですか?

これはSIGHUPによって殺されるはずだったと確信していましたが、これは起こりませんでした。再度ログインすると、プロセスは問題なく実行され、pstree「採用」されたことが示されましたinit

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

しかし、そうであれば、nohupコマンドの目的は何ですか?とにかく、プロセスは強制終了されないようです。


編集1

いくつかの詳細:

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

編集2

質問をより明確に述べると、プロセスをバックグラウンドで(&またはを使用してbg)配置するとSIGHUPnohupコマンドのように無視されますか?


編集3

を手動で送信しようとSIGHUPしましたscp:終了したので、シグナルを無視しません。

その後、もう一度起動してバックグラウンドにinit戻し、ログオフしました。「採用」されて実行され続け、再度ログオンするとそこに見つかりました。

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


コンソールI / Oについては言及していませんでした。1>/dev/null 2>&1bashなどのために物事を流用しましたか?
エイブリーペイン

いいえ、しませんでした。SCPはもちろん標準入力を必要としませんでした...そして標準出力は問題とは思われませんでした。
マッシモ

シェルがログインシェルとして実行されるかどうかによってパフォーマンスが変わります。これはここでのケースです。
ワーナー

他のいくつかのテストを完了しました。ここでまとめました:serverfault.com/questions/117152
マッシモ

回答:


20

答えが見つかりました。

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

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

BASHのマニュアルページの詳細:

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

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


2
それは馬鹿げたデフォルトですが、私の内臓は、bashではなくRHフォールトだと教えてくれます。ところで、zshでは&!を使用できます。否認へのショートカットとして、&で分岐したプロセスは、ため息をつく。
ユルゲンストロベル

7

Warnerに同意し、組み込みの「disown」コマンドを使用してシェルがSIGHUPを送信しないようにできることを付け加えます。bashのマニュアルページには、適切な説明が含まれています。


4

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

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

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


なぜダウン投票するのですか?nohupとscreenを使用することは、ログアウト時にプロセスが強制終了されるのを避けるための完全に受け入れられる方法です。他にもありますが、これらは両方とも機能します。どうしたんだ?
ジム

2
それは素晴らしいポイントだと思いますが、Qは「彼のプロセスが殺されないようにする方法」ではなく、なぜ彼のプロセスが殺されないのかについてです。
-CarpeNoctem

2

プロセスをバックグラウンドにフォークするとき、それはそれを実行するシェルからの子プロセスのままです。

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

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


したがって、この場合、プロセスはSIGHUPを受け取っているはずですよね?たぶんそれを無視しただけかもしれませんが、確認します。
マッシモ

はい、正確に。それが状況だと私は信じています。文書化されたパフォーマンスに本当に疑問がある場合は、信号をトラップしてログに記録する小さなスクリプトをハックすることができます。
ワーナー

0

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

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

見る:

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

4:22 PMに編集1

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


その投稿は実際に私に質問をすることを望んでいました。詳細については、上記の編集を参照してください。
マッシモ

2
他のスレッドの答えは、使用しているSCPコマンドを読み、それがSIGHUPにどのように応答するかを確認する必要があるように聞こえます
-mfinni

そして、「nohup」は、SIGHUPで死ぬことを知っているコマンドのためのものであり、それを望まないでしょう。
mfinni

マニュアルページはそれを教えてくれません。私はそれを殺してみます
マッシモ

-1

のようなツールを使用してコマンドを起動しなかったscreen場合、セッションが終了すると、そのセッションに関連するすべてのジョブ/タスクも終了します。


それは私が考えていたこととまったく同じです。
マッシモ

あなたが説明したことをするたびに彼らは持っています...多分それはあなたが使うシェルに依存しますか?
ウォーレン

-1ありません。答えはそれほど単純ではありません。バックグラウンドで開始した単純なシェルスクリプトをテストしました。ループし、出力を一時ファイルに送信しました。ターミナルを終了した後も動作し続けました(tail -f一時ファイルのように。これは、bashを使用するCentOS 7.1マシンで。
Mike S

@MikeS-デモしてください。あなたが説明する行動を目撃したことはありません
ウォーレン

@warren-への私の答えを見てください serverfault.com/questions/117152/...を。多くの人々があなたが説明するものとは異なる行動を主張することに注意してください。実際、マッシモは、彼のプロセスが継続したために投稿しました。
マイクS
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.