サーバー管理やプログラミングにおいて、コマンドを実行している最中に端末を閉じてしまうと、実行中のプロセスが中断してしまうことがあります。特に長時間実行が必要なプロセスにおいては、そのリスクが深刻です。そんなときに役立つのがnohupコマンドです。この記事では、nohupの基本的な使い方から、プロセス確認・停止方法、効果的な活用法まで詳しく解説します。
nohupとは?
nohup(「no hang up」の略、読み方は「のーはっぷ」)は、LinuxやUnixシステムで使用されるコマンドです。通常、シェルを閉じたりログアウトしたりすると、端末からSIGHUP(ハングアップシグナル)が送られ、そのセッション内で実行されていた全てのプロセスが中断されます。nohupを使用することで、このSIGHUPを無視してプロセスをバックグラウンドで継続して実行できます。
構文
nohup COMMAND [ARG...]
# 実運用ではたいてい &(バックグラウンド化)と併用
nohup COMMAND [ARG...] &
# 代表的なリダイレクトの組み合わせ
nohup COMMAND </dev/null >nohup.out 2>&1 &
- 標準入力が端末なら
/dev/nullに、標準出力が端末ならnohup.out(カレントディレクトリ、または$HOME/nohup.out)へ、標準エラーが端末なら標準出力へ自動リダイレクトされます(追記モード)。 - パイプライン全体を保護したい場合は、
sh -c '…'など1コマンドに包むのが確実です。
nohupの基本的な使い方
nohupは非常にシンプルに使用することができます。通常のコマンドの前にnohupを追加し、末尾に&を付けてバックグラウンドで実行します。
nohup your-command &
実行例
例えば、何らかの長時間処理を行うスクリプトlong-running-script.shをバックグラウンドで実行したい場合、以下のようにすれば良いです。
nohup ./long-running-script.sh &
tail -f nohup.out
実行すると以下のようなメッセージが表示され、出力はnohup.outに追記されます。
nohup: ignoring input and appending output to 'nohup.out'
このnohup.outはコマンド実行時のカレントディレクトリに生成されます。カレントに書けない場合は$HOME/nohup.outが使われます。
nohupでの出力リダイレクト
nohupで実行されたコマンドの標準出力とエラー出力はデフォルトでnohup.outにリダイレクトされますが、任意のファイルにリダイレクトしたい場合は以下のように指定できます。
nohup ./your-command > output.log 2>&1 &
ここで> output.logが標準出力をoutput.logにリダイレクトし、2>&1が標準エラー出力も同じファイルにリダイレクトしています。これによって、コマンド実行のすべての出力ログを一元管理できます。
出力先を指定した実行例
nohup ./server --port 8080 > /var/log/myserver.log 2>&1 &
エラー例:nohup.outを作れない場所での実行
カレントディレクトリにも$HOMEにも書き込み権限がないと、以下のようなエラーになります。
nohup: failed to open 'nohup.out' for writing: Permission denied
この場合は明示的に出力先を指定してください。
nohup ./your-command > /tmp/output.log 2>&1 &
パイプライン全体を保護する
そのまま nohup cmd1 | cmd2 と書くと、cmd1 しかSIGHUP保護されません。パイプライン全体を保護するには、sh -c で包みます。
nohup sh -c 'cmd1 | cmd2 | gzip > /data/archive.gz' > job.log 2>&1 &
入力を切って端末から完全に独立させる
端末からの入力を一切受けないよう明示することで、完全にデタッチした状態で実行できます。
nohup python worker.py </dev/null > worker.log 2>&1 &
実行中のプロセス確認と停止方法
nohupで起動したプロセスは、以下の方法でPIDを確認して停止できます。
PIDの確認
nohup実行直後にシェルがPIDを表示します。
nohup ./long_task.sh &
# [1] 12345 ← これがPID
後から確認する場合はpsやpgrepを使います。
# コマンド名で検索
ps aux | grep long_task.sh
# プロセス名で直接検索
pgrep -l long_task
プロセスの停止
# PIDを指定して停止
kill 12345
# 強制停止(通常のkillで止まらない場合)
kill -9 12345
# プロセス名で一括停止
pkill -f long_task.sh
並行処理とnohupの組み合わせ
nohupは、並行して複数のプロセスを管理する場合にも非常に有効です。例えば、以下のように複数のコマンドを同時にバックグラウンドで実行することができます。
nohup command1 &
nohup command2 &
nohup command3 &
これによって、複数のプロセスを同時に立ち上げ、それぞれの進行を確認するために事務作業の手間を大幅に省くことができます。
効果的な活用法
nohupを活用することによって、特定の状況下で業務効率を上げることが可能です。ここでは、nohupを使ったいくつかの効果的な活用法をご紹介します。
長時間のバッチ処理
データベースのバックアップや大規模なファイル転送、複雑な計算処理など、長い時間がかかるバッチ処理を行う際にnohupを使用すると便利です。これにより、シェルからログアウトしても安心して作業を続けることが可能です。
サーバー運用
サーバー管理者にとって、システムのアップデートやリモートサーバーでのメンテナンス作業を行う際、セッションが切れてしまうリスクを気にせずに作業を行えるというのは大きなメリットです。nohupによってこうした環境での安定性を確保できます。
開発環境でのテスト
開発者も、テストやデプロイなどで多くのスクリプトを実行することがあります。nohupを使用することで、長時間実行されるテストを中断することなく安心して他の作業に集中することができます。
sudoとの組み合わせ
root権限が必要なコマンドをnohupで実行する場合はsudoと組み合わせます。
sudo nohup ./system-maintenance.sh > /var/log/maintenance.log 2>&1 &
関連コマンド
disown:シェルが送るSIGHUP対象からジョブを外す(Bash/Zsh)。すでにバックグラウンドで動いているプロセスを後から切り離す際に使います。setsid:新しいセッションで実行(端末からの切り離しをさらに強化)。screen/tmux:デタッチ可能な仮想端末で長時間作業。ログアウト後に再接続して出力を確認できます。systemd-run/daemon:サービス化やワンショット実行で確実に常駐させる方法。at/batch:後で/負荷低下時にジョブを実行するスケジューリング。
注意点
nohupの使用は非常に便利ですが、注意すべき点もあります。
- プロセスが終了する前に端末を閉じると、
nohupの出力ログを確認するまで状況を把握しにくくなります。出力先を明示的に指定し、tail -fで定期的に確認するのがおすすめです。 - 多くのプロセスをバックグラウンドで走らせると、サーバー負荷が高くなる場合があるので、リソース管理には注意が必要です。
nohupは「SIGHUP無視」が主目的で、制御端末の完全な切断や作業ディレクトリの保持などは別問題です。サービスとして確実に常駐させるならsystemdなどのプロセス管理ツールを使いましょう。- POSIX に準拠しており、GNU/BSD/BusyBox環境で概ね同じ動作をしますが、メッセージや細部に違いがあります。
まとめ
nohupは、長時間実行が必要なプロセスをログアウトや端末切断後も継続させるための非常に強力なツールです。基本的な使い方はコマンドの前にnohupを付けて末尾に&を加えるだけですが、出力リダイレクト、パイプライン保護、プロセス管理などを組み合わせることで、さらに柔軟に活用できます。長時間のバッチ処理やサーバー運用などの場面でぜひ活用してください。

コメント