如何实现lockfile命令的功能

Géza土耳其语

我正在尝试为在集群上运行的软件实现基于文件系统的锁。基础共享文件系统是使用DRBD实现的,因此可以认为可以保证同步性。我当前的实现如下所示:

# check the lock file                                                                                                 
if os.path.isfile(lockfile):                                                                                       
    if time.time() - os.path.getmtime(lockfile) > 3600:                                                             
        logInfo('lock is older than 3600s, removing it and going on collecting result.')                           
        os.remove(lockfile)                                                                                        
    else:                                                                                                             
        logInfo('Previous action is still on-going, please wait until it\'s finished or timeout.')
        sys.exit(1)

# create the lock file                                                                                                
open(lockfile, 'w').close();

显然,当在群集中不同计算机上运行的脚本的多个实例可能一致认为系统已解锁,创建锁文件并执行需要相互排斥的操作时,可能会发生这种情况。

综上所述,我需要一个基于文件系统的锁定工具,并且锁定检查和创建共同构成了一个原子操作。

使用lockfile命令可以在Shell脚本中实现相同的功能

Géza土耳其语

可以通过使用os.open来实现解决方案,它包装了open系统调用:

import os,errno
def lockfile(filename):
    try:
        os.close(os.open(filename, os.O_CREAT | os.O_EXCL | os.O_WRONLY));
    except OSError as e:
        if e.errno == errno.EEXIST:  # System is already locked as the file already exists.
            return False
        else:  # Something unexpected went wrong so reraise the exception.
            raise
    return True  # System has successfully been locked by the function

注意os.open()的第二个参数。根据此答案,当将标志O_EXCL与O_CREAT结合使用且路径名已存在时,则open()将失败,或更确切地说,将使用errno EEXIST引发OSError,这在我们的情况下意味着系统为已经锁定。但是,当路径指向不存在的文件时,将立即创建该路径,而不会为文件系统的其他用户同时执行相同的步骤留出时间范围。并且根据这一点,可以认为所描述的技术在很大程度上与平台无关。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何实现打印功能?

来自分类Dev

如何实现超时功能?

来自分类Dev

如何实现功能?

来自分类Dev

如何实现重播功能?

来自分类Dev

如何实现点击功能

来自分类Dev

如何实现条纹功能

来自分类Dev

如何实现搜索功能?

来自分类Dev

如何实现异步功能?

来自分类Dev

如何在命令行工具中实现实用程序功能

来自分类Dev

如何实现智能作物功能

来自分类Dev

jQuery如何实现toggleClick功能

来自分类Dev

如何实现递归功能?

来自分类Dev

如何实现装饰器功能

来自分类Dev

如何实现闯入javascript功能?

来自分类Dev

如何实现暂停命令(lavalink)?

来自分类Dev

如何实现字节命令类

来自分类Dev

如何通过简单的功能实现自动归纳

来自分类Dev

如何使用泛型实现此功能?

来自分类Dev

如何在Django中实现搜索功能?

来自分类常见问题

如何在Numpy中实现ReLU功能

来自分类Dev

如何强制后代类实现抽象功能?

来自分类Dev

JavaScript的本机排序功能如何实现?

来自分类Dev

如何动态地实现特定功能?

来自分类Dev

如何为哈希表实现擦除功能?

来自分类Dev

如何使用“ subtemplated”实现模板化功能

来自分类Dev

如何在类中实现接口功能

来自分类Dev

如何实现堆栈列表的擦除功能?

来自分类Dev

如何实现设备端CUDA虚拟功能?

来自分类Dev

如何通过Qt实现浏览按钮功能