【问题标题】:locking a PID file锁定 PID 文件
【发布时间】: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 来实现其他锁机制会更好吗?谢谢。

【问题讨论】:

    标签: bash locking pid


    【解决方案1】:

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

    【讨论】:

    • 这是一种有趣的方法,它对我有用。唯一棘手的部分是在后台使用正确的进程 PID 重写 PID 文件 (background_function &; echo $! > lock.pid)。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-29
    • 1970-01-01
    • 1970-01-01
    • 2021-03-29
    • 2015-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多