web-dev-qa-db-ja.com

Ctrl + Cを使用して、Bashスクリプトで開始されたすべてのバックグラウンドプロセスを強制終了する方法

ArchLinux(マンジャロ)。

1つのbashファイルを実行しています。 &を使用して、2つのプロセス(コマンド)を実行します。しかし、私が押すと Ctrl+C プログラムを停止するには-1つのプロセスが停止し、もう1つのプロセスは動作し続けます。

両方のプロセスを停止するにはどうすればよいですか?または、これら2つのプロセスを強制終了するための新しいスクリプトを作成するにはどうすればよいですか?

9
Ievgen

更新:trapは、条件に応じてSIG接頭辞を削除する必要がありますが、一部のシェルではこれを含めることができます。以下のコメントを参照してください。

アンパサンド「&」は、新しいプロセスのバックグラウンドでコマンドを実行します。親プロセス(この場合はbashスクリプトを実行するコマンド)が終了すると、このバックグラウンドプロセスは親プロセスをinit(PID 1のプロセス)にリセットしますが、終了しません。 ctrl+cを押すと、フォアグラウンドプロセスに割り込み信号が送信され、バックグラウンドプロセスには影響しません。

バックグラウンドプロセスを強制終了するには、killコマンドを使用して、$!で取得できる最新のバックグラウンドプロセスのPIDを指定する必要があります。

ctrl+cを使用してスクリプトとバックグラウンドプロセスの両方を強制終了する場合は、次のようにします。

trap 'kill $BGPID; exit' INT
sleep 1024 &    # background command
BGPID=$!
sleep 1024      # foreground command of the script

trapSIGINTのトラップハンドラーを変更します(trapSIG接頭辞を削除する必要がありますが、一部のシェルはこれを含めることをサポートする場合があります)。これにより、スクリプトはプロセスを強制終了します終了する前に$BGPIDを使用します。

17
lyang

プログラムはSIGTSTPも無視できるため、Ctrl+c信号を無視できます

ほとんどのシェルでCtrl+zを試すことができます(常にではありませんが、ほとんどの場合)。

プロセスで無視できないシグナルがいくつかあります:SIGKILL、SIGSTOP。 killコマンドを送信できます。凍結されたプロセスを強制終了するには、プロセスID(PID)を見つける必要があります。
pgrepまたはpsを使用して、それを強制終了します

 % kill -9 PID
1
Romano