在下面的代码片段中,我希望将脚本限制为每次只运行一个副本,并且如果它因任何原因死亡,则重新启动 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
将显示锁文件已被两个进程打开。