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