确保Linux中的应用程序的单个实例

我正在WxPython中开发一个GUI应用程序,并且我不确定如何确保在计算机上的任何给定时间只运行我的应用程序的一个副本。 由于应用程序的性质,多次运行没有任何意义,并且会很快失败。 在Win32下,我可以简单地创建一个有名的互斥锁并在启动时检查它。 不幸的是,我不知道Linux中的任何工具都可以做到这一点。

我正在寻找应用程序意外崩溃时会自动发布的内容。 我不想让我的用户不得不手动删除锁定文件,因为我崩溃了。


有几种常用的技术,包括使用信号量。 我看到的最常用的是在启动时创建一个“pid锁定文件”,其中包含正在运行的进程的pid。 如果程序启动时文件已经存在,打开它并抓住内部的pid,检查是否正在运行带有该pid的进程,如果它检查/ proc / pid中的cmdline值以查看它是否为你的程序实例,如果它然后退出,否则用你的PID覆盖文件。 pid文件的通常名称是application_name .pid


正确的事情是使用flock(LOCK_EX)建议锁定flock(LOCK_EX) ; 在Python中,这可以在fcntl模块中找到。

与pidfiles不同,当你的进程因任何原因死亡时,这些锁始终会自动释放,不存在与文件删除有关的竞争条件(因为不需要删除文件来释放锁),并且不会有不同的机会进程继承PID并因此出现以验证陈旧的锁。

如果你想要检测不清楚的关闭,你可以在获取锁之后为文件写入一个标记(比如你的PID,对于传统主义者),然后在干净关闭之前将文件截断为0字节状态); 因此,如果锁没有被保持,并且文件不是空的,则指示不清洁关机。


使用fcntl模块完成锁定解决方案:

import fcntl
pid_file = 'program.pid'
fp = open(pid_file, 'w')
try:
    fcntl.lockf(fp, fcntl.LOCK_EX | fcntl.LOCK_NB)
except IOError:
    # another instance is running
    sys.exit(1)
链接地址: http://www.djcxy.com/p/51161.html

上一篇: Ensure a single instance of an application in Linux

下一篇: .NET console application as Windows service