【发布时间】:2020-07-26 19:55:12
【问题描述】:
我正在编写一个 shell 脚本,它定期执行任务并从另一个进程接收 USR1 信号。
脚本的结构类似于this answer:
#!/bin/bash
trap 'echo "doing some work"' SIGUSR1
while :
do
sleep 10 && echo "doing some work" &
wait $!
done
但是,此脚本的问题是睡眠进程在后台继续,并且仅在超时时终止。 (请注意,当在等待 $! 期间收到 USR1 时,睡眠进程会在其常规超时期间徘徊,但周期性回显确实会被取消。)例如,您可以使用 pkill -0 -c sleep 查看机器上的睡眠进程数。
我读到this page,这表明在陷阱动作中杀死挥之不去的睡眠,例如
#!/bin/bash
pid=
trap '[[ $pid ]] && kill $pid; echo "doing some work"' SIGUSR1
while :
do
sleep 10 && echo "doing some work" &
pid=$!
wait $pid
pid=
done
但是,如果我们快速向 USR1 信号发送垃圾邮件,例如与:
pkill -USR1 trap-test.sh; pkill -USR1 trap-test.sh
然后它会尝试杀死一个已经被杀死的 PID 并打印一个错误。更何况,我不喜欢这段代码。
有没有更好的方法可以在被中断时可靠地杀死分叉的进程?或者是实现相同功能的替代结构?
【问题讨论】:
标签: linux bash shell sleep bash-trap