【ノーハップ】

nohup とは?

最終更新:
💡 切断通知SIGHUPを無視して、コマンドを起動する

指定したコマンドを、端末の切断などで送られるSIGHUPを無視する状態で起動するUnix系のコマンド。自動でバックグラウンド実行や再起動をする機能ではない。

📌 このページのポイント
SIGHUPの既定動作とnohupの比較 nohupなし 端末の切断 SIGHUP SIGHUPを受ける 終了する 既定動作の場合 nohupあり 端末の切断 SIGHUP SIGHUPを無視 続行できる 他の終了原因は別 バックグラウンド実行には & を付ける nohupだけで自動再起動はしない
切断でSIGHUPが送られる場合の比較。左はSIGHUPで終了する既定動作、右はnohupで無視する状態を示します。出力先や対話入力、ほかの終了原因は本文で確認してください。
ひよこ ひよこ
サーバーで長い処理を動かしてるとき、ターミナルを閉じたら止まっちゃうの?
ペンギン先生 ペンギン先生
端末やシェルの動作によっては、切断でSIGHUPが送られ、処理が終了することがあるよ。nohupは指定したコマンドを、この通知を無視する状態で起動する。端末を閉じたら必ずすべての処理が止まる、という共通の決まりではないんだ。
ひよこ ひよこ
どうやって使うの?
ペンギン先生 ペンギン先生
たとえばnohup python train.py > train.log 2>&1 &だよ。nohupはSIGHUPを無視するため、最後の & はシェルでバックグラウンド実行するための指定。この二つは別の役割なんだ。ここでは標準出力と標準エラーをtrain.logにまとめているよ。
ひよこ ひよこ
出力はどこに行くの?
ペンギン先生 ペンギン先生
標準出力が端末なら、nohup.outへ追記される。そこへ書けなければホームディレクトリのnohup.outを試すよ。すでに出力先をファイルへ変更していれば、その出力先を使う。GNU版では端末につながった標準入力も読めない入力へ切り替えるので、対話入力が必要な処理には向かないんだ。
ひよこ ひよこ
nohupならずっと動き続ける?
ペンギン先生 ペンギン先生
SIGHUP以外の終了原因まで防ぐわけではないよ。プログラム自身が終了したり、別のシグナルで止められたり、OSが再起動したりすれば止まる。自動で再実行する機能もないので、ログと終了状態を確認できるようにしておこう。
ひよこ ひよこ
あとから画面に戻って操作したいときは?
ペンギン先生 ペンギン先生
その用途ならtmuxのように、端末の作業環境を切り離して後から再接続できる道具が候補になるよ。nohupは端末への再接続を提供する機能ではない。出力だけ残して一度実行したいのか、対話操作を再開したいのかで選ぼう。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「nohup」って出てきたら「切断通知SIGHUPを無視してコマンドを起動する道具」と思えばだいたいOK!
📖 おまけ:英語の意味
「no hangup」 = ハングアップしない
💬 hangupは電話を切ることや接続の切断を表す言葉。nohupは、SIGHUPという切断通知を無視して起動する働きを表しているよ。

参考資料

← 用語集にもどる