
私はバックグラウンドで実行され、毎時間いくつかのタスクを実行するスクリプトが欲しい。信号を受信したら終了する必要があります。最後に終了する前に、いくつかのクリーンアップ操作を実行する必要があります。
この概念に基づいて、次のように書きました。
trap 'clean_up; exit' SIGTERM
while true
do
someActions
sleep 1h
done
スクリプトを実行します。
./script &
私はスクリプトを殺す。
kill -SIGTERM <pid>
スクリプトが期待どおりに機能していないことがわかりました。その理由は、信号だけで眠るプロセスを殺すことができるからだと思いますSIGKILL
。しかし、一方でSIGKILL
出る前に掃除をするように指示することはできません。
それでは、プロセスがバックグラウンドで待機し、他の信号を受信したときに終了させる方法は何ですかSIGKILL
?
答え1
「期待どおりに動作しない」とは、SIGTERM ハンドラを作成したが、SIGTERM に対して実行されなかったことを意味します。コードに間違いがあります。
以下は実際の例です。
#!/bin/bash
cleanup () {
echo "goodbye!"
exit 0
}
trap 'cleanup' SIGTERM
while sleep 1; do
echo $BASHPID
done
反応は予想通りでしたkill -SIGTERM
。すでに知っているSIGKILLとSIGSTOPを除いて、任意の信号を使用できます。