如何让进程在后台等待并能够被KILL以外的信号杀死

如何让进程在后台等待并能够被KILL以外的信号杀死

我想要一个在后台运行的脚本,每小时执行一些操作。如果收到信号,它也应该退出。最后,它应该在退出之前执行一些清理操作。

基于这个概念,我写了如下内容:

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。

相关内容