锁定PID文件

时间:2017-10-15 14:19:08

标签: bash locking pid

我在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来实现其他锁定机制会更好吗?感谢。

1 个答案:

答案 0 :(得分:0)

如果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