SIGINTまたはSIGTERMが子プロセスではなく親スクリプト自体に送信されたときにコマンドまたは関数を実行します。

SIGINTまたはSIGTERMが子プロセスではなく親スクリプト自体に送信されたときにコマンドまたは関数を実行します。

私にこれがあるとしましょう。script.sh

#!/bin/bash
exit_script() {
    echo "Printing something special!"
    echo "Maybe executing other commands!"
    kill -- -$$ # Sends SIGTERM to child/sub processes
}

echo "Some other text"
#other commands here
sleep infinity

受信時に、または例えば次のようなscript.sh機能を実行したいと思います。exit_scriptSIGINTSIGTERM

killall script.sh # it will send SIGTERM to my script

私のスクリプトがこれを実行したい

exit_script() {
    echo "Printing something special!"
    echo "Maybe executing other commands!"
    kill -- -$$ # Sends SIGTERM to child/sub processes
}

私は以下を使ってこの機能を達成しようとしています。trap

trap exit_script SIGINT SIGTERM

私の質問に答えた人は私が間違っていることを証明しました。ただし、子/子プロセスに送信された信号にのみ反応するように見える
ため、機能しません。trap初心者としてtrapマニュアルページを復号化できないため、解決策が欠落している可能性があります。

私の考えでは、これはChromiumのような「実際の」プログラムが転送するときに実行する作業のようです。SIGTERM

~からhttps://major.io/2010/03/18/sigterm-vs-sigkill/

SIGTERMを受け取ると、アプリケーションは何をすべきかを決定できます。ほとんどのアプリケーションはリソースをクリーンアップして停止しますが、一部のアプリケーションではそうでない可能性があります。

答え1

trap呼び出しプロセス信号自体に応答します。ただし、信号を受信する前に呼び出す必要があります。私は、スクリプトの始めに。

また、それを使用してkill -- -$$スクリプトにシグナルを送信するには、killを実行する前にトラップをクリアする必要があります。そうでなければ無限大で終わります。キル&トラップリングの形。

たとえば、

#!/bin/bash
exit_script() {
    echo "Printing something special!"
    echo "Maybe executing other commands!"
    trap - SIGINT SIGTERM # clear the trap
    kill -- -$$ # Sends SIGTERM to child/sub processes
}

trap exit_script SIGINT SIGTERM

echo "Some other text"
#other commands here
sleep infinity

コメントに記載されているように、問題はスクリプトがシグナルを受信しますが、受信したシグナルを処理する前にスリープルーチンが終了するのを待っていることです。したがって、トラップジョブを実行するには、子プロセス(この場合は休止プロセス)を終了する必要があります。次の方法を使用してこれを実行できます。

kill -- -$(pgrep script.sh)

またはコメントで述べたように:

killall -g script.sh

関連情報