如何在 Linux 中存储 lockfile 命令的 PID

Posted

技术标签:

【中文标题】如何在 Linux 中存储 lockfile 命令的 PID【英文标题】:How to stock PID of lockfile command in Linux 【发布时间】:2012-03-18 07:39:50 【问题描述】:

我在 linux 中使用lockfile 命令来管理对特殊文件的访问。

当我的主脚本由于某种原因崩溃时,我完成了挂锁,阻止了主脚本的任何新启动并严重影响了它的执行。

有没有办法存储我的 lockfile 进程的 PID,以便我可以在重新启动我的主要脚本之前跟踪它们并进行适当的清理。

希望我已经足够清楚了......

【问题讨论】:

【参考方案1】:

这是一个脆弱的机制。我更喜欢使用真正的文件锁,所以当拥有它们的进程死亡时,O/S 会自动释放锁。在 perl 中很容易做到(使用 flock 函数),但我不知道在 Bash 中是否可行。

更重要的是,我想您可以使用锁文件本身来保存持有锁的脚本的 PID,对吧?

(我不太会编写 shell 脚本...我认为下面的代码大部分是正确的,但使用风险自负。存在竞争条件。)

while [[ lockfile -! -r 0 lock.file ]]
do
    kill -0 `cat lock.file`
    if  [[ $? -ne 0 ]]
    then 
        # process doesn't exist anymore
        echo $$ >lock.file
        # do something important
        rm -f lock.file
        break
    fi
    sleep 5
done    

或者,这个怎么样:

while [[ true ]]
do
    if [[ ! -e pid.file ]]
    then
        echo $$ > pid.file
    else
        if [[ kill -0 `cat pid.file`]]
        then
            # owner process exists
            sleep 30
        else
            # process gone, take ownership
            echo $$ > pid.file
            # ### DO SOMETHING IMPORTANT HERE ###
            rm -f pid.file
            break
        fi
    fi
done

我更喜欢第二个。它仍然远非完美(很多竞争条件),但如果没有太多进程争夺锁,它可能会起作用。另外,如果可能的话,sleep 30 应该包含一些随机性(睡眠的长度应该有一个随机分量)。

但请看这里,it looks like you can use flock with some versions of the shell。这与我在 perl 中所做的类似,并且比我能想到的替代方案更安全。

【讨论】:

感谢您的回答,我遇到的问题与等待获得锁的进程有关,而不是正在执行代码的进程,因此它们挂在示例的第一行。因此,当脚本死亡时,他们会继续获得锁,并且没有更多的脚本允许他们释放锁...... 同时,我很想知道您在 Perl 中使用哪个工具来锁定文件。操作系统自动清理将是最好的解决方案。但同时它应该是 NFS 抗性的...... 好的,我添加了更多细节。恐怕我不是世界上最好的 Bash 程序员,所以请谨慎使用。我不认为您可以使用锁定文件完全避免竞争条件。 添加了另一个尝试,它不使用 lockfile。

以上是关于如何在 Linux 中存储 lockfile 命令的 PID的主要内容,如果未能解决你的问题,请参考以下文章

读写两个进程的同一个文件是不是需要lockfile

Delphi 在 Windows 7 64 上使用 LockFile

npm notice created a lockfile as package-lock.json. You should commit this file.

renv 0.12.0 是从项目库中加载的,但 renv 0.11.0 记录在 lockfile 中

Linux中如何启动进程?进程调度命令都有哪些?

QT防止程序多次启动