Bash Nohup vs アンパサンド

Dr. Muhammad Abdullah 2023年6月20日
  1. Linux プロセスをバックグラウンドで実行する
  2. アンパサンド (&) 制御演算子
  3. nohup コマンド
  4. 制御演算子 &nohup コマンドの違い
Bash Nohup vs アンパサンド

この短い記事では、Bash を介してバックグラウンドで Linux プロセスを実行するための nohup コマンドと & 制御演算子について説明します。 さらに、nohup& の主な違いをさらに調べます。

Linux プロセスをバックグラウンドで実行する

Linux には、バックグラウンドでプロセスまたはコマンドを実行するための 2つの方法が用意されています。

  1. アンパサンド (&) 制御演算子のみを使用します。
  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

ここで、PIDsleep コマンドに割り当てられたプロセス ID を表します。

制御演算子 &nohup コマンドの違い

以下は、&nohup を使用してバックグラウンドでコマンドまたはプロセスを実行する場合のいくつかの違いです。

  1. nohup はハングアップ信号 (SIGHUP) をキャッチできますが、& はできません。 SIGHUP シグナルは、プロセスが開始された端末が閉じられたときにプロセスにシグナルを送信するために使用されます。

  2. 通常、プロセスまたはコマンドは、このコマンドまたはプロセスを開始するシェルが存在するまで、& を使用してバックグラウンドで実行されます。 シェルが終了すると、& を使用してバックグラウンドで実行されているすべての関連コマンドまたはプロセスも終了します。

    端末が終了すると、SIGHUP (kill SIGHUP <pid>) を使用したハングアップ シグナルによって、その端末のすべてのサブコマンドまたは子プロセスが終了します。 ただし、これは nohup を使用して防ぐことができます。

    nohup コマンドは SIGHUP シグナルをキャッチし、実際のコマンドに到達させません。 したがって、Bash ターミナルの終了時にコマンドが終了しないように制限します。

  3. &nohup のもう 1つの違いは、stdout/stderr のリダイレクトに関するものです。

    & 演算子は stdout/stderr を自動的にリダイレクトせず、コマンドの出力を端末に直接表示します。 ただし、nohup$HOME にあるファイル nohup.outstdout/stderr をリダイレクトします。