在 bash 中使用 flock,为什么终止子进程也会终止父进程?

在 bash 中使用 flock,为什么终止子进程也会终止父进程?

在下面的代码片段中,我希望将脚本限制为每次只运行一个副本,并且如果它因任何原因死亡,则重新启动 server.x。

如果不涉及 flock,如果我终止服务器进程,循环就会正确地重新启动,但是一旦我使用 flock 来确保脚本只运行一次,如果我终止 server.x,它也会终止父进程。

我如何确保在 flock 脚本中终止子进程后父进程仍能继续存在?

#!/bin/bash
set -e
(
    flock -x -n 200
    while true
    do
        ./server.x $1
    done
) 200>/var/lock/.m_rst.$1.lock

答案1

我认为锁文件可能会干扰子进程,导致它以非零退出状态终止:set -e如果 exit 非零中的一个命令,将导致脚本终止,例如:

#!/bin/bash
set -e
echo hello
false
echo goodbye

输出:

hello

还值得注意的是flock(2) 手册页表示flock系统调用将文件句柄复制到派生进程并跨 execve 复制;这可能意味着server.x锁文件打开不愉快。在以下示例中,两个进程都将持有锁:

#!/bin/bash
(
  flock -x -n 200
  bash
) 200>/tmp/test.lock

执行时执行此测试lsof | grep /tmp/test.lock将显示锁文件已被两个进程打开。

相关内容