如何避免程序的多个实例?

问题描述 投票:8回答:3

我需要找到一种正确的方法来阻止我的(Python)程序的两个运行实例。我目前正在使用以下方法。

在Windows上,

os.popen('wmic process get caption,processid | findstr `programname.exe`')

在Linux上,

os.popen('ps x | grep `programname`')

它似乎现在工作正常。这种方法是否正确?有人可以向我建议一个更好的方法吗?

编辑:感谢回复家伙,上述方法有什么问题吗?我尝试了linux的pid文件方式。如果pid文件以某种方式被删除怎么办?

python instance
3个回答
5
投票

有很多方法:

  1. 在/ var / run或类似的(跨平台)中有一个“实例文件”
  2. 使用固定插座(跨平台)
  3. 使用DBus注册名称(linux)

您需要的是一个服务(在您的应用程序外部),它管理一个名称空间,其中可以使用和执行唯一ID。


2
投票

在Linux上,我曾经写过一个pid文件,粗略地说:

if (pidfile already exists)
    read pidfile content
    if (/proc/<pid>/exec == my executable)
        already running, exit
    else
        it´s a stale pidfile, delete it
write my own pid to pidfile
start the 'real' work

最近,我听说过flock(1)工具。它在bash脚本中更容易使用:

( flock -n 200 || exit
    # ... commands executed under lock ...
) 200>/var/lock/mylockfile

并且不太难以使用“真正的”编程语言,只需打开一个文件并尝试在其上获得flock(2)


1
投票

对于linux,请参阅jldupont的答案。对于Windows,请使用CreateMutex方法创建命名互斥锁。见:http://msdn.microsoft.com/en-us/library/ms686927%28VS.85%29.aspx

© www.soinside.com 2019 - 2024. All rights reserved.