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

8 投票
3 回答
7030 浏览
提问于 2025-04-15 16:59

我需要找到一个合适的方法来防止我的(Python)程序同时运行两个实例。现在我使用的是以下方法。

在Windows上,

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

在Linux上,

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

目前看来这个方法还不错。这个方法对吗?有没有人能给我推荐一个更好的方法?

补充:谢谢大家的回复,以上的方法有什么问题吗?我试过在Linux上使用pid文件的方法。如果pid文件不小心被删除了怎么办?

3 个回答

1

对于Linux系统,可以参考jldupont的回答。
对于Windows系统,可以使用CreateMutex方法来创建一个命名的互斥体。具体可以查看这个链接:http://msdn.microsoft.com/en-us/library/ms686927%28VS.85%29.aspx

2

在Linux系统上,我以前会写一个进程ID文件,大概是这样的:

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)

5

有很多种方法:

  1. 在 /var/run 或类似的地方放一个“实例文件”(这种方法在不同平台上都可以用)
  2. 使用一个固定的套接字(这种方法在不同平台上都可以用)
  3. 使用 DBus 来注册一个名字(适用于 Linux 系统)

你需要的是一个服务(在你的应用程序之外),它负责管理一个命名空间,在这个命名空间里,唯一的 ID 是可用的并且是被强制执行的。

撰写回答