首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >fcntl删除行为

fcntl删除行为
EN

Unix & Linux用户
提问于 2018-02-02 09:34:19
回答 1查看 472关注 0票数 1

我需要通过fcntl创建锁,以便在给定参数的情况下只运行一次脚本。为此,我使用给定的参数创建一个文件,并获取该文件的锁。下面的代码是用python编写的。为了简单起见,我将文件名硬编码为"mylockfile“

代码语言:javascript
复制
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并启动脚本的另一个实例。而且,我期望它在获取锁时失败,因为前面的进程仍然附加了打开的文件描述符。但是,它实际上获得了锁,我不知道为什么会发生这种情况。如果这是预期的行为,我们如何确保锁文件是安全的删除?

EN

回答 1

Unix & Linux用户

发布于 2018-02-02 09:46:37

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

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

票数 1
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/421391

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档