はじめに

こんにちは!今回はnohupコマンドについて解説します。

nohupは、ターミナルを閉じた後もプロセスを実行し続けるコマンドです。長時間かかる処理をバックグラウンドで実行する時に便利ですね。

SSH接続を切った後も、サーバーでのタスク実行を続けたい時には欠かせませんよ!


nohupコマンドとは

nohupは、“no hang up"の略で、SIGHUPシグナルを無視して、プロセスを実行し続ける外部コマンドです。

通常、ターミナルを閉じるとそのターミナルで実行していたプロセスも終了してしまいます。しかし、nohupでコマンドを実行すると、ターミナルを閉じてもプロセスは実行を継続します。

バックアップやデータ処理など、時間のかかるタスクをサーバーで実行する時に重宝します。


基本構文

1
nohup コマンド [引数]

実行結果はnohup.outファイルに保存されます。


主なオプション

オプション 説明
なし 実行結果をnohup.outに保存
> ファイル 実行結果を指定ファイルに保存
2>&1 標準エラーも標準出力にリダイレクト
& バックグラウンド実行

使用例

例1: 基本的な使い方

1
nohup sleep 100 &

実行結果:

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

プロセスをバックグラウンドで実行し、HUPシグナルを無視します。

例2: 出力をファイルに保存

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

実行結果:

1
[1] 12346

スクリプトの実行結果をbackup.logに保存します。

例3: 長時間処理を実行

1
nohup tar czf large_backup.tar.gz /var/www &

実行結果:

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

大量のファイルをアーカイブする処理を実行します。

例4: データベースダンプを実行

1
nohup mysqldump -u root -p database > db_backup.sql 2>&1 &

実行結果:

1
[1] 12348

データベース全体をダンプして、バックアップを取ります。

例5: ログファイルの監視

1
nohup tail -f /var/log/app.log &

実行結果:

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

ログファイルを継続的に監視します。

例6: Python スクリプトを実行

1
nohup python3 data_processing.py > output.log 2>&1 &

実行結果:

1
[1] 12350

Pythonスクリプトをバックグラウンドで実行します。

例7: 複数プロセスを並列実行

1
2
3
nohup task1.sh > task1.log 2>&1 &
nohup task2.sh > task2.log 2>&1 &
nohup task3.sh > task3.log 2>&1 &

実行結果:

1
2
3
[1] 12351
[2] 12352
[3] 12353

複数のタスクを同時に実行します。

例8: 出力ファイルを確認

1
cat nohup.out

実行結果:

1
2
3
4
5
Processing started...
Progress: 25%
Progress: 50%
Progress: 75%
Completed successfully

プロセスの実行ログを確認できます。

例9: プロセスの状態を確認

1
ps aux | grep nohup

実行結果:

1
2
root 12351  0.5  2.3  234567  45678 ?  Ss  12:00  0:05 python3 script.py
root 12352  0.2  1.5  123456  23456 ?  Ss  12:00  0:02 tar czf backup.tar.gz

実行中のnohupプロセスを確認します。

例10: タスク完了後の出力を確認

1
2
3
4
jobs -l
nohup sleep 5 && echo "Task completed" &
sleep 6
cat nohup.out

実行結果:

1
Task completed

完了メッセージを確認できます。


Tips・注意点

バックグラウンド実行は必須ではない

1
2
nohup ./long_task.sh
# 実行中でもターミナルを閉じられる

nohupは必ずしも&と一緒に使う必要はありませんが、通常はバックグラウンド実行します。

SSH接続を閉じる前に確認

1
2
3
nohup long_task &
# ターミナルを閉じる前に Enter キーを押して、プロンプトに戻る
exit

バックグラウンドプロセスがきちんと起動してから接続を閉じましょう。

出力ファイルを明示的に指定

1
2
3
4
5
# 良い例:ログファイルを明示的に指定
nohup ./script.sh > script.log 2>&1 &

# 避けるべき:ファイル名を指定しない(nohup.outが作られる)
nohup ./script.sh &

ログファイル名を明示的に指定する方が、後で管理しやすいです。

プロセスの出力をリダイレクト

1
nohup command > /dev/null 2>&1 &

出力が不要な場合は、/dev/nullにリダイレクトして、ログファイルが作られないようにできます。


実践的な使い方

リモートサーバーでのバックアップ実行

1
2
3
ssh user@server
nohup tar czf /backup/site_$(date +%Y%m%d).tar.gz /var/www &
exit

SSH接続を切った後も、バックアップが継続実行されます。

crontabの代わりに使用

1
2
# ターミナルで直接実行
nohup python3 /usr/local/scripts/daily_task.py > /var/log/daily_task.log 2>&1 &

スクリプトをcrontabに登録せず、手動で実行できます。

ログファイルの監視を継続

1
nohup tail -f /var/log/application.log &

ターミナルを閉じた後も、ログの監視を続けることができます。

データ処理パイプライン

1
nohup cat input.csv | sed 's/,/\t/g' | awk '{print $1, $3}' > output.txt 2>&1 &

複雑なパイプラインを長時間実行できます。


まとめ

nohupコマンドのポイント:

  • ターミナル切断後もプロセスを継続実行
  • HUPシグナルを無視して実行を続ける
  • 基本形: nohup command > logfile 2>&1 &
  • 出力ファイルは明示的に指定するのが推奨
  • SSH接続を切った後も長時間タスクが実行される
  • よく使う組み合わせ: nohup ./script.sh > log.txt 2>&1 &

リモートサーバーでの長時間処理に欠かせないコマンド。バックアップやデータ処理を安心して任せられますよ!