私は優雅な誰かが Jenkins ジョブを中止した場合に強制終了させてしまうため、中止シグナルをトラップし、シェルスクリプトを使用して強制終了の手順をカスタマイズしよう
としました。しかし、Jenkins はすべてのトラップを無視し、とにかく強制終了しているようです 。
テスト用のサンプルスクリプト
exit_script() {
echo "Printing something special!"
echo "traped & killed " >>text.txt
echo "Maybe executing other commands!"
trap - INT TERM ABRT QUIT HUP # clear the trap
kill -- -$$ # Sends SIGTERM to child/sub processes
}
trap 'exit_script' INT KILL ABRT QUIT HUP
echo "pid is $$"
echo "pid is $$" > test.txt
count=0
sleep 10
echo 1
echo 1 >>test.txt
sleep 10
echo 2
echo 2 >>test.txt
sleep 10
echo 3
echo 3 >>test.txt
sleep 10
echo 4
echo 4 >>test.txt
sleep 10
echo 5
echo 5 >>test.txt
sleep 10
echo 6
echo 6 >>test.txt
exit 0
どうやって罠にかけられるか探しているシグナルタームJenkins でシグナルを送信し、kill コマンドをカスタマイズします。
参考までに: このスクリプトは私のシステム bash では正常に動作します。INT->SIGINT などを変更するだけです。
答え1
いくつかの修正が必要なだけで、正常に動作していると思います。トラップに関連する機能に問題がある場合は、動作exit_script()
しません。
削除してテストしたところkill -- -$$
、関数が呼び出され、プロセスが引き続き実行されるので正常に動作します。
答え2
一般的に、シェルスクリプトでは、SIGTERMシグナルを次のようにトラップします。
trap 'exit_script' TERM
PS KILL をトラップしても機能せず、QUIT を 2 回リストしても効果はありません。