bash で sleep しているときにシグナルをトラップする
雑に作るデーモンなど、無限ループする bash スクリプトで、sleep で待っている間にもシグナルを受けて何か処理をしたいときがある場合に使えるテク。 具体的には、たとえば ECS ではタスクを止めるときに SIGTERM をプロセスに送信し、終了しない場合は 30 秒待ってから SIGKILL で無理やり殺しにかかってくが、30 秒以上 sleep していると SIGTERM をトラップできずにキレイに終了できない。というような場合など。 code:bash
trap "exit 0" SIGINT SIGTERM
nanika() {
# なにかする処理
}
while true
do
nanika
# いったんフォアグラウンドに処理を戻して wait で sleep の終了を待つことでシグナルをトラップしてキレイに死ねる。
sleep 10 & wait $!
done