8

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

在 Windows 上,

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

在 Linux 上,

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

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

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

4

3 回答 3

5

有很多方法:

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

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

于 2009-12-14T13:41:45.623 回答
2

在Linux上,我曾经写过一个pidfile,大致如下:

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)

于 2009-12-14T14:19:02.900 回答
1

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

于 2009-12-14T13:45:33.243 回答