如何检测其他正在运行的Python脚本?
我有一个脚本,它使用了GTK这个工具。现在我想知道如果这个脚本的另一个副本启动了,会发生什么。如果它启动了,窗口就会变大。
请告诉我怎么才能检测到这个情况。
4 个回答
0
我根据不同的情况用过几种方法。
- 有一次,我的脚本需要监听一个TCP端口。所以我就检查这个端口是否可用,如果可用,那就说明是一个新的副本。这对我来说已经足够了。不过在某些情况下,如果端口已经被占用,可能是因为其他应用程序正在监听这个端口。你可以使用操作系统的调用来查找是谁在监听这个端口,或者尝试发送数据并检查响应。
- 还有一次我使用了PID文件。你只需要决定一个位置和文件名,每次你的脚本启动时,读取这个文件来获取一个PID。如果这个PID正在运行,说明已经有另一个副本在了。否则,就创建这个文件,并把你的进程ID写进去。这非常简单。如果你在使用django,可以直接使用django的daemonizer:“from django.utils import daemonize”。如果不是,你可以使用这个脚本:http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/
1
你可以用一个PID文件来判断这个应用程序是否已经在运行了(只要在谷歌上搜索“python daemon”,就能找到一些有效的实现方法)。
如果你发现程序已经在运行,你可以通过命名管道和正在运行的实例进行沟通。
3
你可以使用一个叫做D-Bus的服务。你的脚本会在当前会话中,如果没有找到正在运行的服务,就启动一个新的服务;如果有正在运行的服务,它就会发送一个D-Bus消息给那个服务(这个消息可以发送“任何东西”,包括字符串、列表和字典)。
基于GTK的库libunique(可能没有Python的绑定?)在实现“唯一”应用程序时就是用这种方法。