web-dev-qa-db-ja.com

切断後も実行を継続するには、プロセスを勘当する必要がありますか?

切断した後もジョブを実行し続けたい場合、disownが必要かどうかとその理由を誰かが説明しますか。

私が訪れたすべてのサイトがdisownbgを使用するように言っているので、私は尋ねますが、bgはそれ自体で機能しており、理由はわかりません。

disownの目的を完全に理解していないためですか、それともbgコマンドのデフォルトの動作に影響を与えている設定がどこかにあるためですか?

これが私がしたことです:

  • SSH経由でCentOS6ボックスに接続
  • 簡単なプロセスを作成しました:

    tar zcvf example.tar.gz ./examplepath > /dev/null 2>&1
    
  • 仕事を中断した

  • bg 1を介してバックグラウンドで再開しました
  • SSHサーバーから切断されました

次に、FTPを介して、.tar.gzファイルのサイズがまだ大きくなっているかどうかを確認しました。

2
E-71

bgまたは&を介してバックグラウンドで処理されたプロセスは、通常、次の2つのシナリオで停止します。

  1. シェルはSIGHUPを受け取ります
  2. 彼らは、もはや存在しない端末に書き込もうとします。

アイテム#1は、端末を閉じるときの主な原因です。ただし、それが発生するかどうかは、how端末を閉じるかどうかによって異なります。あなたはそれを閉じることができます:

  1. ウィンドウマネージャーの「X」をクリックするようなもの
  2. exitlogout、または CTRL+D

アイテム#1は、SIGHUPが送信される結果となるアイテムです。 #2はしません。

非常に長い話ですが、プロセスをbgでバックグラウンドし、次にexitlogout、または CTRL+D、プロセスは強制終了されません。

4
Patrick

端末を閉じると、この端末を使用するすべてのプロセス(ps -elf出力のTTY列を参照)はSIGHUPを受け取ります。 SIGHUPで何をするかは処理次第です。従来のUNIX(AIX、Solaris)では、このシグナルでプロセスが閉じられます。そのため、disownを使用する必要があります。 man bashから:

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

1
dchirikov