fcntl 删除行为

fcntl 删除行为

我需要通过 fcntl 创建锁,以使脚本仅使用给定参数运行一次。为了实现这一点,我使用给定的参数创建一个文件并获取它的锁。我用 python 编写了以下代码。为了简单起见,我将文件名硬编码为“mylockfile”

import traceback
from errno import EACCES, EAGAIN
from fcntl import lockf, LOCK_EX, LOCK_NB
from time import sleep

import os

if __name__ == '__main__':
   # Create lock file and write current pid into it
   fd = open("mylockfile", 'w')
   fd.write("%d " %os.getpid())
   try:
        x = lockf(fd, LOCK_EX | LOCK_NB)
        print("Obtained lock")
        # Do useful work
        sleep(10)

    except OSError as e:
        # Terminate in case of error

        if e.errno in (EACCES, EAGAIN):
            print("Script already running")
            print(e.errno)
        # Traceback of OSError
        traceback.print_exc()
        fd.close()
        exit(1)

    # Do other useful work

现在,问题是当它进入睡眠状态时,我手动删除 mylockfile 并启动该脚本的另一个实例。而且,我预计它无法获取锁,因为前一个进程仍然附加有打开的文件描述符。但是,它实际上获取了锁,我不确定为什么会发生这种情况。如果这是预期的行为,我们如何确保锁定文件不会被删除?

答案1

一旦锁定文件被删除,打开的文件描述符和文件名之间的任何关系都会丢失。因此,新进程无法发现还有另一个进程正在运行。

也没有办法保护锁定文件不被删除超出通常的 UNIX 权限;如果有足够的权限,该文件始终可以被删除。该进程可以定期检查锁定文件是否仍然存在并做出相应反应(要么终止,要么重新创建锁定文件),但没有办法做到万无一失。

相关内容