我想要一个在后台运行的脚本,每小时执行一些操作。如果收到信号,它也应该退出。最后,它应该在退出之前执行一些清理操作。
基于这个概念,我写了如下内容:
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。