我正在编写一个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并显示错误。更不用说,我不喜欢此代码。
是否有更好的方法来可靠地杀死被中断的分叉进程?还是实现相同功能的替代结构?
我正在编写一个Shell脚本,该脚本在从另一个进程接收到USR1信号后定期执行任务。脚本的结构类似于以下答案:#!/ bin / bash trap'echo“ ...
让我们首先在交互式外壳中重现该问题。