🍇

nohup と & の組み合わせによる長時間コマンド実行の安定運用

2025/02/07に公開

1. なぜ nohup と & が必要なのか?

長時間かかるコマンドを実行している最中に、ターミナル接続が切れてしまう、あるいはリモートセッションがタイムアウトしてしまった経験はありませんか?
特に、大規模なデータベースのリストア作業やシステムバックアップのような処理は、途中で中断されると作業全体が失敗してしまいます。
リモート接続の切断でプロセスが終了する理由とその対策

そこで登場するのが nohup と & の組み合わせです。
これらを活用することで、ログアウト後もプロセスを安定して継続させることができます。

2. nohup と & の基本的な使い方

2.1 nohup とは?
nohup は no hang up の略で、シェルのセッションが終了(ログアウト)してもプロセスを継続させるコマンドです。
通常、ターミナルを閉じると実行中のコマンドは終了しますが、nohup を使えばプロセスは バックグラウンドで継続します。

nohup コマンド

例: nohup sleep 600
→ 10分間スリープするコマンドが、接続が切れても終了しません。
※ログアウト操作はできません。

2.2 & とは?
& はコマンドを バックグラウンドで実行するためのシェル演算子です。
これにより、ターミナルがすぐに解放され、別の作業を続けることができます。

コマンド &

例: sleep 600 &
→ コマンドはバックグラウンドで実行され、ターミナルは即座に使用可能になります。

3. nohup と & を組み合わせるメリット

nohup& を組み合わせることで、以下のメリットが得られます。

  • ログアウトしてもプロセスが継続: リモート接続が切れても作業が中断されない。
  • ターミナルの解放: コマンド実行中でもターミナルで別の作業が可能。
  • 自動ログ出力: nohup.out に標準出力と標準エラーが自動的に保存されるため、進行状況の確認が容易。

4. 具体例: MySQLで大規模SQLファイルをリストアする

MySQLのデータベースリストア作業は、特に大規模なデータベースの場合、数時間以上かかることがあります。
この作業中にターミナルが切断されると、リストアが中断し、最初からやり直す必要が生じます。

4.1 通常のMySQLリストアコマンド

mysql -u root -p your_database < /path/to/backup.sql

このコマンドを実行すると、リストアが完了するまでターミナルは使用できません。
ターミナルが切断された場合、リストアは中断されます。

4.2 nohup と & を使ったリストア
nohup& を組み合わせることで、リストア作業を安定して実行できます。

nohup mysql -u root -pYourPassword your_database < /path/to/backup.sql &

nohup により、ログアウトしてもリストアが継続されます。
& により、リストア中もターミナルで別の作業が可能です。
ログファイル nohup.out にリストアの進行状況が記録されます。

4.3 リストア進行状況の確認
リストア作業中に進行状況を確認するには、以下のコマンドで nohup.out を確認します。

tail -f nohup.out

tail -f でリアルタイムに進行状況を確認できます。

5. 実行中のプロセスの管理

5.1 実行中のプロセスを確認
再ログイン後にプロセスが実行中か確認するには、ps コマンドを使用します。

ps aux | grep mysql

6. 注意点とベストプラクティス

6.1 nohup.out の管理

  • デフォルトでは nohup.out に出力が記録されますが、別のファイルにリダイレクトすることで管理しやすくなります。
    <リダイレクト演算子ガイド>
nohup mysql -u root -pYourPassword your_database < /path/to/backup.sql > restore.log 2>&1 &

6.2 パスワードの扱い

  • コマンドラインにパスワードを直接記述するとセキュリティリスクがあるため、~/.my.cnf に保存するか、mysql_config_editor を使用することを推奨します。

6.3 ログローテーション

  • 長時間の実行で nohup.out が肥大化する場合は、定期的にログローテーションを行います。

7. 代替手段: screen や tmux の活用

nohup& の組み合わせは便利ですが、より高度なセッション管理を行いたい場合は、screen や tmux を使用することも検討しましょう。

  • screen: 仮想ターミナルを作成し、ログアウト後も再接続が可能。
screen

実行後、Ctrl + A → D でデタッチし、再ログイン後に screen -r で再接続します。

  • tmux: 複数のウィンドウやペインでターミナル作業を管理できます。

8. まとめ

nohup& の組み合わせは、長時間実行するコマンドの安定運用において非常に有用です。
特に、MySQLのリストア作業や大規模なデータ処理のようなタスクでは、ターミナルセッションの切断による作業中断を防ぐための強力なツールとなります。

また、nohup.out を活用することで、進行状況のログを確認しやすくなるため、プロセス管理もスムーズに行えます。

長時間コマンドを安定して実行する必要がある場合は、ぜひ nohup と & の組み合わせを活用してみてください!

株式会社KOMPEITO テックブログ

Discussion