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

标签 linux bash

我有一个脚本作为服务执行,函数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/

相关文章:

java - openjdk中的原生linux方法在哪里?

c - 在 Windows 上运行用 Linux 编写的 C 程序

bash - 如何使用xargs输出到不同的文件名?

git - .bashrc 未被 git bash 读取 git 2.5.1

c - Bash 在简单程序上重新打开 tty

linux - Bash - 使用双方括号和单方括号时

linux - 什么是 Linux 内核上下文中的 DMA 映射和 DMA 引擎?

linux - 将更改 ID 添加到旧的 git 提交的简单方法?

linux - 如何将文件从 cpanel 帐户下载到另一个 cpanel 帐户

javascript - 由于(可能)错误的 bash 脚本导致的一些奇怪的错误