ArchLinux(マンジャロ)。
1つのbashファイルを実行しています。 &
を使用して、2つのプロセス(コマンド)を実行します。しかし、私が押すと Ctrl+C プログラムを停止するには-1つのプロセスが停止し、もう1つのプロセスは動作し続けます。
両方のプロセスを停止するにはどうすればよいですか?または、これら2つのプロセスを強制終了するための新しいスクリプトを作成するにはどうすればよいですか?
更新: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
trap
はSIGINT
のトラップハンドラーを変更します(trap
はSIG
接頭辞を削除する必要がありますが、一部のシェルはこれを含めることをサポートする場合があります)。これにより、スクリプトはプロセスを強制終了します終了する前に$BGPID
を使用します。
プログラムはSIGTSTPも無視できるため、Ctrl+c
信号を無視できます
ほとんどのシェルでCtrl+z
を試すことができます(常にではありませんが、ほとんどの場合)。
プロセスで無視できないシグナルがいくつかあります:SIGKILL、SIGSTOP。 killコマンドを送信できます。凍結されたプロセスを強制終了するには、プロセスID(PID)を見つける必要があります。
pgrepまたはpsを使用して、それを強制終了します
% kill -9 PID