🐧 Linux 総合学習プラットフォーム

ログアウトしたら数時間かかるジョブが途中で死んでいた(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 で作業画面ごと復帰するのが確実。

▶ 学習アプリでしっかり学ぶ