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

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

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

私が質問する理由は、私が訪問したすべてのサイトで を使用するように指示されているのですdisownが、それだけではうまく機能せbgbg、その理由がよくわからないからです。

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

私がやったことは次のとおりです:

  • SSH経由でCentOS 6ボックスに接続
  • シンプルなプロセスを作成しました:

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

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

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

答え1

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

  1. シェルはSIGHUPを受信する
  2. もはや存在しない端末に書き込もうとしています。

項目1は、ターミナルを閉じるときに最も問題となるものです。ただし、これが発生するかどうかは、どうやってターミナルを閉じます。次の方法で閉じることができます。

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

項目 #1 は SIGHUP が送信される項目です。#2 は送信されません。

つまり、簡単に言うと、 でプロセスをバックグラウンドにしてから、 、、または+bgでログアウトしても、プロセスは終了されません。exitlogoutCTRLD

答え2

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

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

関連情報