nohup と & の組み合わせによる長時間コマンド実行の安定運用
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 と & の組み合わせを活用してみてください!
Discussion