(最終更新月:2023年5月)
✔このような方へ向けて書かれた記事となります
「nohupコマンドって何ができるのだろうか?」
「nohupコマンドの書き方が知りたい」
「nohupコマンドの実例が見たい」
✔当記事を通じてお伝えすること
- nohupコマンドの基本
- nohupコマンドの書き方やその応用
- nohupコマンドの実例
当記事では、nohupコマンドの基本だけでなく、そのオプションを活用した使い方まで、具体例を用いて詳しく解説しています。
ぜひ最後までご覧ください。
nohupコマンドの基本
nohupコマンドの基本について見ていきます。
応用した使い方を理解する前に、必ず目を通しましょう。
- nohupコマンドの概要
- nohupコマンドの目的と利点
nohupコマンドの概要
nohupとは、プログラムをターミナルから切り離して実行し、ユーザーがログアウトした後もプログラムが終了せずに実行し続けることを可能にする機能です。
名前の由来は “no hangup”(ハングアップしない)からきています。
nohupコマンドの目的と利点
nohupを使うメリットは、長時間実行する必要があるプログラムや、リモートサーバでタスクを実行する際に役立つこと。
ユーザーがログアウトしても、それらのプロセスは中断されずに実行し続けるからです。
これにより、大規模なデータ処理やバッチ処理が無中断でおこなえます。
nohupコマンドで知っておくべき必須用語
nohupコマンドを扱うにあたって、次の用語を知っておく必要があります。
出てくる頻度が高いものは、正しく理解しておきましょう。
- プロセスとは?
- シグナルとは?
- バックグラウンドプロセスの意義
- SIGHUPシグナルの役割
プロセスとは?
プロセスとは、コンピュータ内で実行中のプログラムのインスタンスのこと。
それぞれのプロセスは独自のプロセスIDを持ち、OSによって管理されます。
シグナルとは?
シグナルとは、OSがプロセスに対して何らかのイベントを通知するための仕組みです。
例えば、プロセスを終了させるSIGTERMや、プロセスに一時停止を指示するSIGSTOPなどがあります。
バックグラウンドプロセスの意義
バックグラウンドプロセスとは、ユーザーからの直接的な入力を必要とせずに実行されるプロセスのことを指します。
これにより、時間がかかるプロセスを実行中でも、他の作業を同時におこなうことが可能になります。
SIGHUPシグナルの役割
SIGHUPは、ユーザーがログアウトしたときなどにデフォルトで送信されるシグナルで、通常はプロセスを終了させます。
しかし、nohupコマンドを使うと、このSIGHUPシグナルを無視してプロセスを実行し続けることができます。
nohupコマンドの書式と主なオプション
nohupの書式を確認していきましょう。
こちらの内容を理解しておけば、最低限使えるようになります。
- 基本的な書式
- 主なオプション
- コマンド実行例
基本的な書式
nohupコマンドの基本的な書式は以下の通りです。
nohup command [arg]…
ここで、”command”は実行したいコマンドを、”[arg]…”はそのコマンドに渡す引数を指します。
主なオプション
nohupコマンド自体には特別なオプションはありませんが、コマンドの後に “&”を追加すると、コマンドをバックグラウンドで実行することができます:
nohup command [arg]… &
コマンド実行例
例えば、長時間実行するスクリプト”long-run-script.sh”をバックグラウンドで実行したい場合は次のようにします:
nohup ./long-run-script.sh &
このコマンドを実行すると、スクリプトの出力はnohup.outというファイルに保存されます。
nohupコマンドの使いどころと動作
nohupをどのような場面で使うのが良いのでしょうか?
場面を理解して使ってみるのが、習得するための近道です。
- バックグラウンドでの使用例
- リモートサーバーでの使用例
- コマンドとの組み合わせ
バックグラウンドでの使用例
例えばデータベースのバックアップを取るスクリプトの実行など、バックグラウンドで使用したいケースがあります。
なぜなら通常の方法だと、完了するまで他の作業ができなくて不便だからです。
nohupコマンドを使用して、バックグラウンドで実行することをおすすめします。
リモートサーバーでの使用例
リモートサーバーで長時間実行するタスクを開始した後、ネットワーク接続が切れてもタスクが続行されるように、nohupコマンドを使用します。
以下がその具体例です。
「long-running-script.sh」という長時間実行するスクリプトをnohupで実行します。
nohup ./long-running-script.sh &
コマンドとの組み合わせ
nohupコマンドは、パイプ(|)やリダイレクト(>)と組み合わせての使用も可能。
例えば、特定の出力先に結果を保存したい場合は、次のようにします:
nohup command > output.txt &
nohupコマンドのリカバリー
nohupでコマンドを失敗したときのリカバリー方法をご紹介します。
コマンドを打ち間違えたときに思い出してください。
- 「nohup」をつけ忘れた場合
- 「&」をつけ忘れた場合
- 「nohup」も「&」もつけ忘れた場合
「nohup」をつけ忘れた場合
すでに実行中のプロセスをnohup状態にすることは直接的にはできませんが、以下の手順でプロセスを現在のシェルセッションから切り離せます。
- 一時停止(ctrl+z)
- バックグラウンドで再開(bg)
- disownコマンドを使用することでプロセスを現在のシェルセッションから切り離す
これにより、そのプロセスはユーザーログアウト時のSIGHUPシグナルを受け取らなくなります。
なお、これらの手順はbashシェルやその派生シェルで有効です。
他のシェルでは異なる手順が必要な場合があります。
「&」をつけ忘れた場合
既に実行中のプロセスをバックグラウンドに移動させるには、ctrl+zでプロセスを一時停止した後、bgコマンドを使用します。
bg %ジョブ番号
ジョブ番号にはプロセスの一時停止で表示される番号のこと。
「nohup」も「&」もつけ忘れた場合
上の手順と同じです。
- ctrl+zでプロセスを一時停止
- bgコマンドでバックグラウンドに移動
- 最後にdisownコマンドでプロセスをシェルから切り離す
nohupをつけてバックグラウンドで実行したのと同じ状態にすることが可能です。
nohupコマンドの注意点とトラブルシューティング
nohupコマンドを使用する際の注意点を見ていきましょう。
問題が起こる前に理解しておけば、トラブル発生時の対応がスムーズです。
- nohup.outやその他の出力ファイルの扱い
- プロセスの停止方法
- バックグラウンドプロセスの確認方法
- よくあるエラーと対処法
nohup.outやその他の出力ファイルの扱い
nohupコマンドを使用すると、以下の情報は、デフォルトで「nohup.out」にリダイレクトされます。
- 実行したプログラムの標準出力
- 標準エラー出力
出力を別ファイルにリダイレクトするには、コマンドラインで明示的に指定しましょう。
プロセスの停止方法
バックグラウンドで実行しているプロセスを停止するには、そのプロセスIDを使用してkillコマンドを実行します。
プロセスIDは、jobs -l コマンドで確認できます。
killコマンドについてはこちらをご覧ください。
バックグラウンドプロセスの確認方法
現在のシェルで実行中のバックグラウンドプロセスは、jobsコマンドで確認することができます。
全てのバックグラウンドプロセスを確認するには、psコマンドを使用します。
psコマンドについてはこちらをどうぞ。
よくあるエラーと対処法
nohup: ignoring inputという警告メッセージが出た場合は、コマンドが標準入力を必要としている可能性があります。
この問題を解決するには、</dev/nullをコマンドラインに追加して、標準入力を/dev/nullにリダイレクトしましょう。
nohupコマンドと他のツールとの比較
nohupコマンドとほかのツールを比較してみます。
機能の違いを理解することで、正しく使い分けられるでしょう。
- ジョブスケジューラー (cron, atなど)との比較
- screen, tmuxなどのターミナルマルチプレクサとの比較
ジョブスケジューラー (cron, atなど)との比較
ジョブスケジューラーのcronやatとnohupは、タスクをバックグラウンドで実行する点では共通しています。
しかし、cronやatは特定の時間や頻度でタスクを実行するスケジューリング機能を持っています。
一方、nohupは単に現在のセッションから切り離してタスクを実行するだけで、スケジューリング機能はありません。
cronについて。
screen, tmuxなどのターミナルマルチプレクサとの比較
screenやtmuxはターミナルセッションを保持し、デタッチとアタッチを可能にするツールです。
これらを使うと、セッション全体をバックグラウンドで実行し、必要に応じて再接続することができます。
nohupとの大きな違いは、nohupはプロセスをバックグラウンドで実行し続けるだけで、screenやtmuxのようにセッション全体を管理する機能はありません。
以下はscreenコマンドについて詳しく解説している記事です。
まとめ
nohupコマンドは、長時間実行するプログラムを安全に、中断することなく実行するための重要なツール。
特にリモートサーバーでの作業時や、ユーザーがログアウトしても継続的に実行する必要があるタスクに対して有効です。
より深くUnix系OSのコマンドラインを学びたい方は、シェルスクリプティングや各種Unixコマンド、システム管理について学ぶとよいでしょう。
これらの知識は、日々の作業を自動化したり、システムの問題を診断したりする際に役立ちます。
またnohupと同様に、screenやtmux、ジョブスケジューラーのcronやatなども、バックグラウンドでのタスク実行やプロセス管理に役立つツールです。
それぞれのツールが持つ特性や機能を理解し、適切な状況で利用することをおすすめします。