前書き#
Linux や Unix システムで長時間実行されるコマンドやスクリプトを実行する際に、ターミナルを閉じるか終了するとプロセスも停止してしまうという問題によく遭遇します。このような場合、プロセスがバックグラウンドで実行され、ターミナルの終了に影響されないようにする方法が必要です。そのために、nohup コマンドが役立ちます。
nohup とは?#
nohup
は Linux や Unix システムで使用されるコマンドで、ターミナルを終了してもプロセスをバックグラウンドで継続実行するためのものです。nohup
のフルネームは「no hang up」で、「挂起しない」という意味です。nohup
コマンドを使用すると、ターミナルを終了したり SSH 接続を閉じたりしてもコマンドを継続して実行することができます。
nohup の構文ルール#
nohup
コマンドの基本的な構文は次のとおりです:
nohup COMMAND [ARGS ...] [> output-file 2> error-file] &
各パラメータの意味は次のとおりです:
COMMAND
:バックグラウンドで実行するコマンドやスクリプト。ARGS
:コマンドやスクリプトの引数。> output-file
:出力を指定したファイルにリダイレクトする。2> error-file
:エラーメッセージを指定したファイルにリダイレクトする。&
:コマンドをバックグラウンドで実行する。
nohup
コマンドの実行手順は次のようになります:
nohup
コマンドは現在のシェルの標準入力、標準出力、標準エラー出力をすべて/dev/null
デバイスにリダイレクトし、ターミナルの終了シグナルによる中断を回避します。nohup
コマンドはプロセスをバックグラウンドで実行し、プロセスの PID をターミナルに出力します。- プロセスが実行を開始し、標準出力と標準エラー出力を指定したファイルにリダイレクトします。
- ユーザーはターミナルを終了したり閉じたりしても、プロセスはバックグラウンドで実行され続けます。
nohup の使用方法#
nohup
コマンドの使用は非常に簡単で、上記の基本的な構文に従って入力するだけです。以下にいくつかのnohup
コマンドの使用例を示します:
コマンドをバックグラウンドで実行する#
コマンドをバックグラウンドで実行するには、次のコマンドを入力します:
nohup COMMAND &
例えば、Bash スクリプトをバックグラウンドで実行する場合は次のようにします:
nohup bash test.sh &
標準出力をファイルにリダイレクトする#
nohup bash test.sh > stdout.txt &
標準エラー出力をファイルにリダイレクトする#
nohup bash test.sh 2> stderr.txt &
標準出力と標準エラー出力を同じファイルにリダイレクトする#
1. 同じファイルにリダイレクトする場合
nohup bash test.sh > output.txt 2>&1 &
2. 異なるファイルにリダイレクトする場合
nohup bash test.sh > stdout.txt 2> stderr.txt &
3. より複雑な例では、標準入力(stdin)をリダイレクトします:
nohup ./myprogram > foo.out 2> foo.err < /dev/null &
ここで< /dev/null
が追加されており、標準入力を/dev/null
にリダイレクトしてプログラムが標準入力からデータを読み取らないようにします。
これは実際の問題を解決するためのものです。SSH セッションは後ろのジョブとの対話データを失いたくないため、ログアウト(またはサスペンド)を拒否することがよくあります。この問題が発生した場合、上記のコマンドを使用して 3 つのリダイレクトを行うことで解決できます。
nohup でのバックグラウンドプロセスの管理#
jobs
コマンドを使用すると、現在のシェルでバックグラウンドで実行されているタスクのリストを表示できます。タスクの番号、状態、コマンドなどが表示されます。
例えば、sleep 1000
コマンドをバックグラウンドで実行し、jobs
コマンドで確認する場合は次のようにします:
$ jobs
[1]+ Running nohup sleep 1000 &
ここで、角括弧内の数字はタスクの番号を示し、プラスまたはマイナス記号はタスクの優先度を示し、Running
はタスクがバックグラウンドで実行されていることを示しています。他にもStopped
(停止中)、Done
(完了)などの可能な状態があります。
また、fg
コマンドを使用してバックグラウンドのタスクを前面に移動して続行することもできます。例えば:
$ fg %1
このコマンドはタスク番号 1 のタスクを前面に移動し、続行します。タスクを一時停止または再開する場合は、Ctrl-Z
キーを使用して現在のシェルにSIGTSTP
シグナルを送信します。
$ fg %1
nohup sleep 1000
^Z
[1]+ Stopped nohup sleep 1000
この状態で再開したい場合は、bg
コマンドを使用します:
$ bg %1
[1]+ nohup sleep 1000 &
タスクを終了させたい場合は、kill
コマンドを使用します:
$ kill %1
[1]+ Terminated nohup sleep 1000
すべてのバックグラウンドタスクを終了させたい場合は、disown
コマンドを使用することもできます:
$ disown -a
このコマンドはすべてのバックグラウンドタスクを終了しますが、確認のメッセージは表示されません。jobs
コマンドで確認することで確認できます。
まとめ#
nohup
コマンドを使用すると、プログラムをバックグラウンドで実行できます。ターミナルを閉じたりリモートサーバーとの接続を切断したりしても、プログラムの実行に影響を与えません。nohup
コマンドで起動したプロセスはすべてのターミナルシグナルを無視するため、Ctrl+C
を使用してもプロセスは停止しません。jobs
コマンドを使用してバックグラウンドで実行されているプロセスを表示し、fg
コマンドを使用してプロセスを前面で実行することができます。
nohup
は、ウェブサーバーやデータベースなど、長時間実行する必要があるスクリプトやプログラムを実行するのに非常に適しています。ただし、nohup
コマンドはプロセスが中断される可能性を完全に回避するものではないことに注意してください。システムのクラッシュやプロセスのエラーなど、中断の原因となる状況が発生する可能性があります。
参考文献#
https://en.wikipedia.org/wiki/Nohup
私の個人ブログへようこそ:方寸之间