ジョブ制御をシェルスクリプトに有効にすると(set -m
を使用)、プロセス信号を捕まえることができなくなりました。私は上記のコードを実行し、私は例えばはCtrl + Cを押すと、何も起こりませんジョブ制御がスクリプトで有効になっているときに、プロセス信号を取得できないのはなぜですか?
#!/bin/bash
set -m
for i in `seq 15`; do
trap 'echo " Signal $i catched"' $i
done
while true; do
echo " Waiting for a process signal"
sleep 999
done
:
Waiting for a process signal
^CWaiting for a process signal
をしかし、私はset -m
を削除する同じコードを実行すると、次のコードを見てみましょう
Waiting for a process signal
^C Signal 15 catched
私の質問
は次のとおりです:-
、私は答えを得ますか
- なぜ機能しないのですか?
- ジョブ制御が有効なときにプロセス信号を捕捉することは可能ですか?
注:sleep
の代わりにread
を使用すると、すべてのプロセスで発生するわけではありません。
最初にスクリプトでジョブ制御を有効にするのはなぜですか? – Barmar
ジョブ制御は、外部プログラムをシェルとは異なるプロセスグループで実行することによって機能します。キーボード信号はフォアグラウンドプロセスグループにのみ送られ、プログラムの実行中はシェルはフォアグラウンドグループには含まれません。 – Barmar
@Barmar場合によっては、ジョブ制御はスクリプトで便利です。たとえば、私がバックグラウンドで新しいプロセスを開始するとき、将来、プロセスグループ全体を強制終了する必要があれば、私はそうすることができません。ジョブ制御が有効になっていない場合、新しいプロセスグループは作成されないため、作成されたすべてのプロセスは現在のグループに属します。 – Luisg123v