如何检测已经运行的其他Python脚本副本

时间:2010-02-14 17:30:13

标签: python

我有一个脚本。它使用GTK。我需要知道是否有另一个脚本副本开始。如果它启动窗口将延长。

请告诉我我能检测到它的方式。

4 个答案:

答案 0 :(得分:3)

您可以使用D-Bus服务。如果在当前会话中找不到任何服务,您的脚本将启动新服务,否则将D-Bus消息发送到正在运行的实例(可以发送“任何内容”,包括字符串,列表,dicts)。

基于GTK的库libunique(缺少Python绑定?)在“独特”应用程序的实现中使用了这种方法。

答案 1 :(得分:1)

您可以使用PID文件来确定应用程序是否已在运行(只需在Google上搜索“python守护程序”以查找一些有效的实现)。

如果您检测到该程序已在运行,您可以使用named pipes与正在运行的实例进行通信。

答案 2 :(得分:0)

新副本可以搜索正在运行的副本,触发SIGUSER信号并在您正在运行的进程中触发回调,然后处理所有魔法。

有关详细信息和可能出错的事项列表,请参阅signal库。

答案 3 :(得分:0)

我根据场景使用了几种方法

  1. 在一个案例中,我的脚本必须侦听TCP端口。所以我只是看看端口是否可用它意味着它是一个新副本。这对我来说已经足够了,但在某些情况下,如果端口已经在使用,可能是因为其他类型的应用程序正在侦听该端口。您可以使用OS调用来查找谁正在侦听端口或尝试发送数据并检查响应。
  2. 在另一个案例中,我使用了PID文件。只需确定一个位置和文件名,每次脚本启动时,读取该文件以获得PID。如果该PID正在运行,则表示已存在另一个副本。否则,创建该文件并在其中写入您的进程ID。这很简单。如果你正在使用django,那么你可以简单地使用django的守护进程:“来自django.utils import daemonize”。否则,您可以使用此脚本:http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/