锁定 PID 文件

locking a PID file

我在 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 文件和一个锁定文件吗?或者使用 mkdir 和 touch 实现其他锁定机制会更好吗?谢谢

如果 echo $$ 对你来说足够原子,你可以使用:

echo $$ >> lock.pid
lockedby=`head -1 lock.pid`
if [ $$ != $lockedby ] ; then
    kill -9 $lockedby
    echo $$ > lock.pid
    echo "Murdered $lockedby because it had the lock"
fi

# do things in the script

rm lock.pid