定期执行并在收到信号时执行的功能是否会成为关键区域?

时间:2019-06-11 12:44:35

标签: linux bash

我有一个脚本作为服务执行,该脚本每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是可以使用的安全文件描述符吗?

1 个答案:

答案 0 :(得分:0)

是的,SIGUSR1在执行do_firewall时完全有可能到达。如果要将它用作常规函数调用和信号处理程序,则必须重新输入。

  

而且,200是可以使用的安全文件描述符吗?

当然,可以使用任何您想要的东西。您不必走得太高。使用3很好。文件描述符号在脚本的控制下。 3是最常见的。有些人从10开始。 Bash从63开始,如果您使用其>{var}语法自动分配任意FD数字,则递减计数。