我有一个脚本作为服务执行,该脚本每10秒运行一次功能do_firewall
。当脚本进程接收到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是可以使用的安全文件描述符吗?
答案 0 :(得分:0)
是的,SIGUSR1在执行do_firewall
时完全有可能到达。如果要将它用作常规函数调用和信号处理程序,则必须重新输入。
而且,200是可以使用的安全文件描述符吗?
当然,可以使用任何您想要的东西。您不必走得太高。使用3
很好。文件描述符号在脚本的控制下。 3
是最常见的。有些人从10
开始。 Bash从63
开始,如果您使用其>{var}
语法自动分配任意FD数字,则递减计数。