test.sh
シェルスクリプトが実行中です。
test.sh
このスクリプトの冒頭で以前のスクリプトが実行されている場合は、まずそのスクリプトを終了したいと思います。
終了すると、test.sh
最新のプロセスもすべて終了します。
私ができる簡単な方法はありますか?
ベストアンサー1
#!/bin/sh
term_handler () {
if [ "$ok_to_exit" -eq 1 ]; then
echo 'exiting'
exit
else
echo 'refusing to exit'
fi
}
trap term_handler TERM
ok_to_exit=0
pkill -f test.sh
ok_to_exit=1
while true; do
echo 'working...'
sleep 2
done
このスクリプト(以下のより簡単なバージョンがあります)は、シグナルが受信されたterm_handler
ときにスクリプトを終了するシグナルハンドラをインストールします。TERM
もし変数ok_to_exit
の値はです1
。
実行中の操作のいくつかの形式をシミュレートするループがスクリプトの本文にあります。重要なことは、呼び出す前にpkill
(これをコマンドで変更できますkillall
)ok_to_exit
に設定0
してからすぐに設定することです1
。
一致するすべてのプロセスがシグナルをTERM
受信すると、それ自体はシグナルを受け取りますが、シャットダウンを拒否します。他のマッチングプロセス、まったく同じ状態でない場合(同時に複数回スクリプトを起動すると、これが発生する可能性があります。)終了します。
実行するとスクリプトが出力されます。
refusing to exit
working...
working...
working...
スクリプトの他のコピーが起動すると、出力されてexiting
終了します。
同じスクリプトのより簡単なバージョン:
#!/bin/sh
trap '' TERM
pkill -f test.sh
trap - TERM
while true; do
echo 'working...'
sleep 2
done
これは単に無視するTERM
呼び出し中にシグナルを呼び出し、pkill
続行する前にデフォルトシグナルハンドラーを復元します。