【发布时间】:2018-03-27 03:10:48
【问题描述】:
我在 bash 脚本中有一个函数,该函数在后台无限期运行,并且应通过再次运行相同的脚本来终止。这是一种开关,当我调用此脚本时,它会启动或终止已运行的函数。为此,我使用 PID 文件:
#!/bin/bash
background_function() {
...
}
if [[ ! -s myscript.pid ]]
then
background_function &
echo $! > myscript.pid
else
kill $(cat myscript.pid) && rm myscript.pid
fi
现在,我想避免多个实例运行和竞争条件。我尝试使用flock,并以这种方式重写了上面的代码:
#!/bin/bash
background_function() {
...
}
exec 200>myscript.pid
if flock -n 200
then
background_function &
echo $! > myscript.pid
else
kill $(cat myscript.pid) && rm myscript.pid
fi
但是,这样做时,我锁定了 pid 文件,但是每次我再次启动脚本时,pid 文件都会被 exec 200>myscript.pid 重写,因此我无法检索已经运行的实例的 PID 并终止它。
我能做什么?我应该使用两个不同的文件,一个 pid 文件和一个 lock 文件吗?或者使用 mkdir 和 touch 来实现其他锁机制会更好吗?谢谢。
【问题讨论】: