nohupコマンド(ノーハップ)とは | 意味や読み方など丁寧でわかりやすい用語解説
nohupコマンド(ノーハップ)の意味や読み方など、初心者にもわかりやすいように丁寧に解説しています。
読み方
日本語表記
ノーハップコマンド (ノーハップコマンド)
英語表記
nohup (ノーハップ)
用語解説
nohupコマンドは、LinuxやUnix系のOSで利用されるコマンドの一つで、その名前は「no hang up」(ハングアップしない)の略である。このコマンドの主な目的は、ターミナルセッションを閉じたり、SSH接続を切断したりしても、そのターミナルから起動したプログラムやスクリプトが停止せずに、バックグラウンドで実行され続けるようにすることだ。システムエンジニアを目指す上で、サーバー上で長時間かかる処理を実行する際など、非常に頻繁に利用されるため、その仕組みと使い方を理解しておくことは重要である。
通常、シェルでコマンドを実行しているターミナルセッションが終了すると、そのターミナルで実行されていたプロセス群に対して「SIGHUP」(シグナルハングアップ)というシグナルが送信される。このSIGHUPシグナルを受け取ったプロセスは、デフォルトの動作として自動的に終了してしまう。例えば、SSHでサーバーに接続してデータ処理スクリプトを実行中に、誤ってSSH接続を切断してしまうと、そのスクリプトの実行も中断されてしまうことになる。nohupコマンドは、このSIGHUPシグナルを無視するように、実行対象のコマンドを設定することで、ターミナルセッションが終了してもプロセスが継続して実行されることを可能にするのだ。主に、時間のかかるデータ処理、Webサーバーの起動、バッチ処理など、ユーザーがログオフしても中断させたくない処理に利用される。
nohupコマンドをより詳しく見てみよう。nohupコマンドがプロセスを継続実行させる仕組みは、SIGHUPシグナルの無視と、標準入出力の扱いという二つの側面から理解できる。まず、SIGHUPシグナルの無視についてだが、nohupは起動するコマンドに対して、OSからのSIGHUPシグナルを受け取っても終了しないように設定する。これにより、ユーザーがターミナルを閉じたり、ネットワーク接続が切れたりしても、対象のプロセスは影響を受けずに実行を継続する。
次に、標準入出力の扱いだ。nohupが起動するコマンドは、もはや元のターミナルに接続されていない状態となるため、標準入力(コマンドへの入力)、標準出力(コマンドからの通常の出力)、標準エラー出力(コマンドからのエラーメッセージ)の扱いについて特別な配慮が必要となる。デフォルトでは、標準入力は/dev/nullという特殊なファイルにリダイレクトされる。/dev/nullは「ビットバケツ」とも呼ばれ、ここからデータを読み取ろうとしても何も得られず、ここにデータを書き込もうとするとデータはどこにも保存されずに破棄される。これは、ターミナルがない環境で入力待ちでプロセスが停止しないようにするための措置だ。標準出力と標準エラー出力については、通常、コマンドが実行されたカレントディレクトリにnohup.outというファイルが自動的に作成され、そこにすべての出力が追記されていく。もしカレントディレクトリにnohup.outを作成できない場合は、ユーザーのホームディレクトリに作成される仕組みだ。これにより、ターミナルがなくてもコマンドの実行結果やエラーメッセージを確認できるようになる。
ただし、nohup.outというファイル名や出力先は変更できる。例えば、特定のログファイルにリダイレクトしたい場合や、標準エラー出力だけを別のファイルに書き込みたい場合は、シェルが提供するリダイレクション機能と組み合わせる。一般的な使い方は、nohup コマンド > 出力ファイル 2>&1 & のようになる。ここで、>は標準出力を指定のファイルにリダイレクトし、2>&1は標準エラー出力(ファイルディスクリプタ2)を標準出力(ファイルディスクリプタ1)と同じ場所にリダイレクトするという意味になる。
また、nohupコマンド自体は、対象のプロセスをバックグラウンドで実行する機能は持っていない点に注意が必要だ。プロセスをバックグラウンドで実行するには、コマンドの末尾に&(アンパサンド)を付ける必要がある。nohup コマンド &という形式で使うのが一般的であり、これにより、nohupでSIGHUPシグナルを無視するように設定されたプロセスが、シェルを占有せずにバックグラウンドで実行され、すぐに他のコマンドを入力できるようになる。もし&を付けずにnohup コマンドと実行した場合、プロセスはSIGHUPを無視しつつもフォアグラウンドで実行され、現在のシェルを占有し続ける。この場合でも、ターミナルを閉じればプロセスは継続されるが、通常はバックグラウンドで実行させることが多い。
具体的な利用シナリオとしては、例えばリモートサーバーで、数時間かかる大規模なデータ集計スクリプトを実行したいが、その間ずっとSSH接続を維持しておくのは不便だという場合がある。このような時にnohup ./data_process.sh > process.log 2>&1 &のように実行すれば、スクリプトはバックグラウンドで動き続け、SSH接続を切断して帰宅しても処理が中断されることはない。後で再度SSH接続し、process.logファイルを確認することで、処理の進捗や結果を確認できる。
nohupコマンドは手軽に利用できる強力なツールだが、いくつかの注意点も存在する。nohupはSIGHUPシグナルを無視するだけであり、プロセスがクラッシュしたり、OSが再起動したりした場合に、自動的にプロセスを再起動する機能は持っていない。より高度なプロセスの永続化や管理、自動再起動といった要件がある場合は、systemdなどのサービス管理ツールや、screenやtmuxといった仮想ターミナル管理ツールがより適している。また、nohup.outや指定したログファイルは、コマンドの出力がすべて書き込まれるため、時間の経過とともに肥大化する可能性がある。ディスク容量を圧迫しないよう、定期的な監視やログローテーション(古いログを削除したり圧縮したりする仕組み)を検討する必要がある。実行中のnohupプロセスを停止したい場合は、psコマンドでプロセスID (PID) を特定し、killコマンドで終了させることになる。さらに、シェル組み込みコマンド(例:cd、echo)や、自分で定義したエイリアスには直接nohupを適用できない場合が多いため、その場合はbash -c "コマンド"のようにシェルを介して実行させる方法を取ることがある。
まとめると、nohupコマンドは、ターミナルセッションの終了によるプロセスの停止を防ぎ、長時間実行される処理を安定して稼働させるための基本的ながら非常に重要なコマンドである。その仕組みと使い方、そして注意点を理解することは、システム運用の基礎力を高める上で不可欠な知識と言えるだろう。