シェルスクリプト - 私のプロセスを除く名前ですべてのプロセスを終了する

シェルスクリプト - 私のプロセスを除く名前ですべてのプロセスを終了する

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(これをコマンドで変更できますkillallok_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続行する前にデフォルトシグナルハンドラーを復元します。

おすすめ記事