我有一个脚本作为服务执行,函数do_firewall
每10秒运行一次。当脚本进程接收到SIGUSR1信号时,可以调用相同的函数。该功能是关键区域吗?
代码如下:
SIGUSR1=10
trap do_firewall SIGUSR1
do_firewall() {
# manage some iptables commands implemented in an idempotent
# mechanism
# is this a critical region?
}
###################################################################
# Main block
###################################################################
while true; do
# If there is no do_firewall process running
do_firewall
sleep 10
done
现在,我已经验证了当SIGUSR1捕获信号时,它是由运行主循环的同一进程管理的。我的怀疑是,是否可能发生在我处于
do_firewall
函数中间并且收到SIGUSR1时,其中可能发生竞争的情况。我认为不可以,但我不确定100%。
以防万一,我是否必须在
do_firewall
函数中添加以下内容:do_firewall() {
(
flock -e 200
# critical region
) 200>/var/run/lockfile
}
另外,200是一个安全的文件描述符吗?
最佳答案
是的,SIGUSR1在执行do_firewall
时完全有可能到达。如果您要将它用作常规函数调用和信号处理程序,则需要重新输入。
Moreover, is 200 a safe file descriptor to use?
当然,可以使用任何您想要的东西。您不必走得太高。可以使用
3
。文件描述符号在脚本的控制下。 3
是最常见的。有些人从10
开始。 Bash从63
开始,如果使用其>{var}
语法自动分配任意FD数字,则开始递减计数。
关于linux - 定期执行并在收到信号时执行的功能是否可以成为关键区域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56544052/