nohupコマンドとは?Linuxでログアウト後もプログラムを実行し続ける方法

Linux

LinuxサーバーへSSH接続して長時間かかる処理を実行したあと、「ターミナルを閉じたら処理まで止まってしまった…」という経験はありませんか?

そんなときに便利なのがnohupコマンドです。

nohupを利用すると、SSHからログアウトしたあとでもプログラムを実行し続けられます。

バックアップや大量データの処理、Pythonスクリプトの実行など、時間のかかる作業では非常によく利用されるコマンドです。

この記事では、Linux初心者向けに、nohupコマンドの基本的な使い方、バックグラウンド実行、出力ファイルの扱い、screen・tmuxとの違いまで分かりやすく解説します。

nohupコマンドとは

nohupは、「No Hang Up」の略で、ログアウト時に送信されるSIGHUPシグナルを無視してプログラムを実行するコマンドです。

通常、SSH接続を切断すると、その端末から起動したプログラムも終了します。

しかし、nohupを利用すると、ログアウト後も処理を継続できます。

例えば、Pythonプログラムをバックグラウンドで実行する場合は次のように指定します。

nohup python app.py &

このようにして起動したプログラムは、SSH接続を終了しても実行を続けます。

nohupコマンドの基本構文

nohup コマンド [引数] &

最もよく使われる例は次のとおりです。

nohup ./backup.sh &

最後の&は、バックグラウンドで実行するための指定です。

nohupだけでも利用できますが、通常はバックグラウンド実行と組み合わせて使用します。

バックグラウンドで実行する

例えばPythonスクリプトをバックグラウンドで実行する場合は、次のように入力します。

nohup python app.py &

実行例

[1] 2458
nohup: ignoring input and appending output to 'nohup.out'

表示された数字はジョブ番号とPIDです。

その後、ターミナルを閉じてもプログラムは継続して実行されます。

nohup.outとは

標準出力や標準エラー出力を指定しない場合、出力はnohup.outへ保存されます。

cat nohup.out

プログラムのログを確認したい場合は、このファイルを確認しましょう。

実行するたびに追記されるため、長期間利用する場合は定期的な管理も必要です。

出力先を変更する方法

通常は、nohup.outではなく専用のログファイルへ出力することが多くあります。

nohup python app.py > app.log 2>&1 &

この例では、標準出力と標準エラー出力の両方をapp.logへ保存します。

アプリケーションごとにログを分けられるため、実運用ではこちらの方法が一般的です。

標準出力と標準エラー出力の違い

Linuxでは、通常の出力とエラー出力は別々に扱われます。

出力 説明
標準出力(stdout) 通常の実行結果
標準エラー出力(stderr) エラーメッセージ

2>&1を指定すると、標準エラー出力も標準出力と同じファイルへまとめて保存できます。

実行中のプロセスを確認する

nohupで起動したプログラムは、通常のプロセスとして動作しています。

実行中か確認するには、pgrepやpsコマンドを利用します。

pgrep -a python

または

ps -ef | grep python

PIDが表示されれば、現在も実行中です。

nohupで起動したプログラムを終了する

停止する場合は、PIDを確認してkillコマンドを利用します。

pgrep -a python
kill PID

PIDの代わりに実際の数字を指定してください。

通常はSIGTERMで終了し、それでも停止しない場合だけSIGKILLを利用します。

ログをリアルタイムで確認する

実行中のログをリアルタイムで確認するには、tailコマンドが便利です。

tail -f app.log

処理状況を確認しながら長時間のジョブを監視できます。

&だけとの違い

バックグラウンド実行だけであれば、&だけでも実行できます。

python app.py &

しかし、この方法ではSSH接続を終了すると、通常はプログラムも終了します。

ログアウト後も処理を継続したい場合は、nohupと組み合わせる必要があります。

nohupとscreen・tmuxの違い

コマンド 特徴
nohup ログアウト後も処理を継続する
screen 端末セッションを保持できる
tmux 端末を分割・再接続できる

単純に処理を継続したいだけならnohup、あとで同じ端末へ戻って操作を続けたい場合はscreenやtmuxが適しています。

入力を受け付けないようにする理由

nohupを実行すると、標準入力は通常無効になります。

そのため、キーボード入力を必要とするプログラムは正常に動作しない場合があります。

対話形式のプログラムではなく、バックアップ処理やバッチ処理など、自動実行するプログラムで利用するのが一般的です。

標準出力と標準エラー出力を別々に保存する

通常は両方を同じログへ保存しますが、それぞれ別のファイルへ出力することもできます。

nohup python app.py > app.log 2> error.log &

エラーだけ別ファイルへ保存したい場合に便利です。

実行したコマンドを確認する

実行中のコマンドラインまで確認したい場合は、pgrepの-aオプションが便利です。

pgrep -a python

または、psコマンドでも確認できます。

ps -ef | grep python

長時間実行されている処理では、実際にどの引数で起動したのか確認する場面がよくあります。

シェルスクリプトをnohupで実行する

バックアップや定期処理のスクリプトもnohupで実行できます。

nohup ./backup.sh > backup.log 2>&1 &

処理内容をあとから確認できるよう、ログファイルを指定しておくことをおすすめします。

Pythonプログラムをnohupで実行する

Pythonスクリプトをサーバーで長時間動かす場合にもよく利用されます。

nohup python app.py > app.log 2>&1 &

AI処理やスクレイピング、データ収集など、数時間以上かかる処理でも安心して実行できます。

Javaプログラムをnohupで実行する

Javaアプリケーションをバックグラウンドで起動する場合も同様です。

nohup java -jar sample.jar > app.log 2>&1 &

Webアプリケーションやバッチ処理でもよく利用されています。

実行中のジョブを確認する

現在のシェルで実行したバックグラウンドジョブは、jobsコマンドで確認できます。

jobs

ただし、ログアウト後はjobsでは確認できません。

その場合は、psやpgrepで確認してください。

screen・tmuxと使い分ける

nohupはプログラムを継続実行することが目的です。

一方、screenやtmuxは端末そのものを保持できます。

用途 おすすめ
処理だけ継続したい nohup
あとで同じ端末へ戻りたい screen・tmux
複数のターミナルを管理したい tmux

サーバー運用では、用途によって使い分けることが重要です。

systemdサービスとの違い

常時起動するサービスを運用する場合は、nohupよりもsystemdサービスとして登録する方法が一般的です。

systemdでは、自動起動、障害時の自動再起動、ログ管理などもまとめて設定できます。

一時的な処理であればnohup、常時動かすサービスであればsystemdを利用すると管理しやすくなります。

よくあるエラー

nohup.outが作成される

標準出力を指定していないためです。

必要に応じてログファイルを指定してください。

nohup ./backup.sh > backup.log 2>&1 &

ログアウトしたら終了した

&だけで実行している可能性があります。

ログアウト後も継続するには、nohupと組み合わせて実行してください。

nohup ./backup.sh &

Permission deniedが表示される

実行権限が付与されていない可能性があります。

chmod +x backup.sh

その後、もう一度実行してください。

プロセスが見つからない

処理が既に終了している可能性があります。

ログファイルやpsコマンドで状態を確認しましょう。

よくある質問

nohupだけ実行すればログアウト後も動きますか?

動作は継続しますが、通常はバックグラウンド実行するために&も一緒に使用します。

nohup.outは削除しても大丈夫ですか?

プログラムが利用していないことを確認すれば削除できます。

必要なログであれば保存しておきましょう。

nohupとscreenはどちらが便利ですか?

単純に処理を継続したいだけならnohupが簡単です。

あとで同じ端末へ戻って操作したい場合はscreenやtmuxの方が便利です。

終了するにはどうすればよいですか?

psやpgrepでPIDを確認し、killコマンドで終了します。

nohupはWindowsでも使えますか?

通常はLinuxやUnix系OSで利用するコマンドです。

WindowsではWSLやGit Bashなどの環境で利用できます。

まとめ

nohupコマンドは、Linuxでログアウト後もプログラムを実行し続けたいときに利用する便利なコマンドです。

特に次のコマンドは覚えておくと役立ちます。

コマンド 用途
nohup ./backup.sh & バックグラウンド実行する
nohup python app.py > app.log 2>&1 & ログを保存しながら実行する
pgrep -a python 実行中プロセスを確認する
tail -f app.log ログをリアルタイムで確認する
kill PID nohupで起動したプログラムを終了する

SSH接続で長時間処理を実行する場合は、「nohupで起動 → ログを確認 → pgrepやpsで状態を確認 → 必要に応じてkillで終了」という流れを覚えておくと、安全かつ効率的にサーバーを運用できます。

コメント

タイトルとURLをコピーしました