Linux環境で長時間実行するスクリプトやプロセスを扱う際、ターミナルを閉じた瞬間に処理が中断されてしまった経験はありませんか?
そんなときに役立つのが「nohup
(ノーハップ)」というコマンドです。nohup
を使えば、ターミナルを閉じてもバックグラウンドでプロセスを継続させることができます。本記事では、nohup
の基本的な使い方から応用例まで、実際の使用例を交えてわかりやすく解説します。長時間の処理や自動化タスクを安定して実行したい方におすすめの内容です。
nohup
は、「no hang up」の略で、LinuxやUnix系のOSに標準で搭載されているコマンドです。
通常、ターミナルを閉じると、そのターミナルで起動していたプロセスも一緒に終了してしまいます。しかし、nohup
を使ってコマンドを実行すると、ログアウト後もコマンドがバックグラウンドで動き続けます。
nohup.out
に書き込まれる最もシンプルな使い方は以下のようになります。
nohup コマンド &
nohup python3 my_script.py &
このコマンドを実行すると、my_script.py
がバックグラウンドで動き続け、ログは自動的にnohup.out
に保存されます。
&
を付けることで、そのコマンドがバックグラウンドで実行され、即座にターミナルの操作が可能になります。
デフォルトではnohup
の出力はカレントディレクトリのnohup.out
にリダイレクトされますが、ログを別ファイルに保存したい場合は以下のように記述します。
nohup コマンド > out.log 2>&1 &
>
:標準出力のリダイレクト2>&1
:標準エラー出力も標準出力と同じファイルにリダイレクト&
:バックグラウンド実行nohup ./backup.sh > backup.log 2>&1 &
バックグラウンドで動いているプロセスが本当に実行されているか確認したいときは、以下のコマンドを使います。
ps aux | grep コマンド名
jobs -l
※ただし、ターミナルを閉じるとjobs
では確認できません。
pgrep -fl コマンド名
nohup
で動かしたプロセスを止めたい場合は、kill
コマンドを使います。
kill プロセスID
まずはプロセスID(PID)を調べる必要があります。
ps aux | grep my_script.py
表示されたPIDを使って以下のように停止できます。
kill 12345
強制終了したい場合は-9
オプションを付けます。
kill -9 12345
nohup
と似たような用途で「cron(クーロン)」がありますが、両者の目的は異なります。
比較項目 | nohup | cron |
---|---|---|
用途 | 手動実行の継続 | 定期実行の自動化 |
タイミング | 任意のタイミングで | 設定したスケジュール通り |
ターミナル終了後 | 継続 | 関係なし |
両者を組み合わせて使うことも可能です。例えば、cronで毎日nohup
付きのコマンドを実行することで、定期的な処理をターミナルに依存せず行うことができます。
これは標準的なメッセージで、問題ありません。むしろ、きちんと動作しているサインです。
コマンド実行時のカレントディレクトリにnohup.out
が作成されます。ログがどこにあるかわからなくなった場合は、以下で検索できます。
find /home/username -name nohup.out
スクリプトやプログラムに実行権限が付いていない場合、以下のようなエラーが出ることがあります。
Permission denied
その場合は実行権限を付けましょう。
chmod +x script.sh
nohup
コマンドは、ターミナルの接続状況に依存せずプロセスを継続実行したい場合に非常に便利なコマンドです。長時間実行する処理や、リモート接続で不安定なネットワーク環境での実行などにおいて、信頼性の高い選択肢となります。
nohup
は「no hang up」の略で、ターミナル切断後もコマンドを継続実行できるnohup.out
に保存されるが、ファイル指定も可能&
を併用ps
, pgrep
, 停止はkill
を活用習得しておくと、日々のLinux運用がより安定し、便利になります。