ログアウトしたら数時間かかるジョブが途中で死んでいた(nohup/tmux忘れ)
症状(よく出るエラー)
SSH先で長時間のビルドやデータ処理を流し、端末を閉じて翌朝見ると、プロセスが消えていて出力ファイルは途中まで。ログの最後に Hangup と残っていることもある。
原因
端末との接続が切れると、シェルはその端末に属するジョブへ SIGHUP(回線切断シグナル)を送り、受け取ったプロセスは既定で終了する。SSH切断・端末を閉じる・ネットワーク断のいずれでも同じことが起きる。プロセスは起動したシェルのセッションに紐付いているので、シェルが死ねば道連れになる、というのが仕組み上の理由。
直し方
起動時に nohup long_job.sh > job.log 2>&1 & として SIGHUP を無視させ、出力をファイルに逃がす。すでに走らせてしまったジョブは、Ctrl+Z で止めて bg で再開し disown -h %1 とすれば以後の HUP から外せる(bash の場合)。対話的に様子を見たい作業なら tmux や screen の中で実行し、切断後も tmux attach で作業画面ごと復帰するのが確実。