Bash Nohup vs アンパサンド
この短い記事では、Bash を介してバックグラウンドで Linux プロセスを実行するための nohup コマンドと & 制御演算子について説明します。 さらに、nohup と & の主な違いをさらに調べます。
Linux プロセスをバックグラウンドで実行する
Linux には、バックグラウンドでプロセスまたはコマンドを実行するための 2つの方法が用意されています。
- アンパサンド (
&) 制御演算子のみを使用します。 &と組み合わせてnohupコマンドを使用します。
アンパサンド (&) 制御演算子
& 制御演算子を使用して、任意のコマンドをバックグラウンドで非同期に実行できます。
次のコマンドを検討してください。
sleep 10
sleep コマンドは、特定の時間の遅延を追加します。 sleep 10 コマンドを実行すると、Bash ターミナルが 10 秒間サスペンドされ、ターミナルで他のコマンドを実行できなくなります。
ここで、次のコマンドを検討してください。
sleep 10 &
上記のコマンドはプロセス ID (PID) を表示し、sleep 10 はバックグラウンドで非同期に実行されます。 sleepの終了を待たずに実行制御がコマンド端子に戻ります。
これで、バックグラウンドの sleep コマンドと同時に同じ端末で他のコマンドを実行できます。
次のコマンドを使用して、バックグラウンド プロセスをフォアグラウンドに移動できます。
fg
nohup コマンド
nohup コマンドは、他のコマンドまたはプロセスを実行します。 これは、関連するプロセスが SIGHUP シグナルを受け取るのを防ぐハングアップなしの略です。
ターミナルを閉じた後もコマンドを実行したい場合は、nohup CommandName を使用できます。
ただし、実行制御をすぐに端末に戻してバックグラウンドでコマンドを実行する場合は、次のコマンドを使用する必要があります。
nohup sleep 10 &
上記のコマンドは sleep 10 コマンドをバックグラウンドで実行し、同じ端末で他のコマンドを実行できるようにすぐに制御を返します。
次のように pgrep コマンドを使用して、バックグラウンドで実行されているコマンドを確認できます。
pgrep -a [Command]
pgrep コマンドは Command を検索し、実行中のコマンドの詳細とともにプロセス ID (PID) を表示します。
たとえば、pgrep -a sleep は、関連するバックグラウンド プロセスを次のように表示します。
PID sleep 10
ここで、PID は sleep コマンドに割り当てられたプロセス ID を表します。
制御演算子 & と nohup コマンドの違い
以下は、& と nohup を使用してバックグラウンドでコマンドまたはプロセスを実行する場合のいくつかの違いです。
-
nohupはハングアップ信号 (SIGHUP) をキャッチできますが、&はできません。SIGHUPシグナルは、プロセスが開始された端末が閉じられたときにプロセスにシグナルを送信するために使用されます。 -
通常、プロセスまたはコマンドは、このコマンドまたはプロセスを開始するシェルが存在するまで、
&を使用してバックグラウンドで実行されます。 シェルが終了すると、&を使用してバックグラウンドで実行されているすべての関連コマンドまたはプロセスも終了します。端末が終了すると、
SIGHUP (kill SIGHUP <pid>)を使用したハングアップ シグナルによって、その端末のすべてのサブコマンドまたは子プロセスが終了します。 ただし、これはnohupを使用して防ぐことができます。nohupコマンドはSIGHUPシグナルをキャッチし、実際のコマンドに到達させません。 したがって、Bash ターミナルの終了時にコマンドが終了しないように制限します。 -
&とnohupのもう 1つの違いは、stdout/stderrのリダイレクトに関するものです。&演算子はstdout/stderrを自動的にリダイレクトせず、コマンドの出力を端末に直接表示します。 ただし、nohupは$HOMEにあるファイルnohup.outのstdout/stderrをリダイレクトします。