nohup
接続が切断された場合やログアウトが必要な場合でも、コマンドを実行し続けることができることがわかりました。 sshを介してリモートプログラムを実行しているときにラップトップのnohup nice my command &
ネットワーク接続が失われると、端末に「Broken Pipe」というメッセージが表示され、自動的に終了します。再接続すると操作が失われました。なぜですか?中断された部分から再実行できますか?
答え1
理解すべきいくつかの点は次のとおりです。
nohup
これがプログラムの切断を必ずしも防止するわけではありません。これは、HUP
ユーザーがログアウトしたときにオペレーティングシステムが送信する信号をマスクすることです(効果的にシェルを制御します)。プログラムにまだ端末に接続されているファイル記述子がある場合、プログラムは停止または終了する可能性があります。これが起こらないように、nohupは通常stdoutとstderrをnohup.out
stdinにリダイレクトして閉じます。ただし、プログラムが端末のファイル記述子を開こうとした場合。シェルは呼び出し/セッション間の「作業」を追跡しません。終了したシェルにジョブを再接続できません。いくつかの解決策があります:
screen
または、他の端末エミュレータを使用すると、tmux
他の端末に再接続できます。ここでは、ジョブをバックグラウンドで実行する必要はありません。フォアグラウンドで実行して分離するだけです(Ctrl-A d
usescreen
)。開始されたジョブのPIDを追跡します。
jobs -l
起動後、このコマンドを使用してこの情報を取得できます。新しいシェルにジョブを待機させ、ジョブのpidを知っている場合は、次のコマンドを実行できます。wait <pid>
しかし、出力は依然として送信されnohup.out
、完了した唯一の手がかりは、コマンドプロンプトが再び表示されることです。