私にこれがあるとしましょう。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_script
SIGINT
SIGTERM
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