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

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

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

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

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

【问题讨论】:

    标签: linux pid lockfile


    【解决方案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。
    猜你喜欢
    • 2016-12-26
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多