特定の条件下で、特に特定のファイルが作成された後に、監視して終了する必要がある Cygwin bash スクリプトがあります。ただし、Ctrl + Cと同じレベルの完全性でスクリプトを正確に終了する方法を理解するのは困難です。
test1
以下は、終了するのを待つだけの簡単なスクリプト ( と呼ばれる) です。
#!/bin/bash
test -f kill_me && rm kill_me
touch kill_me
tail -f kill_me
このスクリプトがフォアグラウンドで実行される場合、Ctrl+C はtail
とスクリプト自体の両方を終了します。スクリプトがバックグラウンドで実行されている場合、kill %1
(ジョブ 1 であると仮定して) もtail
とスクリプトの両方を終了します。
ただし、スクリプトから同じことを実行しようとすると、スクリプトをbash
実行しているプロセスのみが終了tail
し、親から切断されたままになっていることがわかります。これが私が試した1つの方法です(test2
):
#!/bin/bash
test -f kill_me && rm kill_me
(
touch kill_me
tail -f kill_me
) &
while true; do
sleep 1
test -f kill_me && {
kill %1
exit
}
done
これが実行されると、バックグラウンドで実行されている bash サブシェルは正常に終了しますが、tail
まだハングアップします。
このように、明示的に別のスクリプトを使用しても、まだ機能しません ( test3
):
#!/bin/bash
test -f kill_me && rm kill_me
# assuming test1 above is included in the same directory
./test1 &
while true; do
sleep 1
test -f kill_me && {
kill %1
exit
}
done
tail
このスクリプトが実行された後もまだぶらぶらしています。
私の実際のケースでは、ファイルを作成するプロセスは特に計測可能ではないため、自然に終了させることはできません。ただし、特定のファイルがいつ作成されたかを調べることで、その時点でそのファイルを終了しても問題ないことを知ることができます。残念ながら、killall
複数のインスタンスが実行されている可能性があり、特定のインスタンスのみを強制終了したいため、シンプルまたは同等のものは使用できません。