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
をリダイレクトします。