2013-06-20 59 views
5

我正尝试使用daemon模块守护进程。代码看起来像这样Python:使用PID文件进行守护进程

import sys 
import time 
import daemon 
import lockfile 


def do_things(): 
    while True: 
     print "hello" 
     time.sleep(3) 

def main() 
    context = daemon.DaemonContext(stdout=sys.stdout, 
            pidfile=lockfile.FileLock('test.pid')) 

    with context: 
     do_things() 

现在,您在这里看到我正在创建一个锁定PID文件。现在我运行这个程序,它运行良好。现在来测试PID /守护功能我用

python test.py 

现在这个时候不应该运行启动该程序的另一个实例,作为现有实例已经在运行。原来,第二个实例启动并进入循环(这不是我测试函数中的while循环)。在这第二个实例运行strace给出了下面的输出汽车无

stat("/some-path-here/[email protected]", {st_mode=S_IFREG|0666, 
st_size=0, ...}) = 0 
select(0, NULL, NULL, NULL, {0, 100000}) = 0 (Timeout) 

link("/some-path-here/[email protected] 4e1a9720.21520", 
"/somepath/test.pid.lock") = -1 EEXIST (File exists) 

而这种痕迹似乎永远,直到该进程被强制杀死。锁文件函数确实检测到存在一个现有的锁文件,但问题是程序没有退出。另外我想这个错误被显示,该pid文件已经存在。

如何才能做到这一点?

回答

2

NOTE:此答案假定您使用的是python-daemon库。

守护程序库带有一个辅助类daemonDaemonRunner它处理创建pid文件。看看它的内部,它使用daemon.pidfile.TimeoutPIDLockFile作为锁文件的类型。

因此,它看起来像你可以由解决这个问题:

  • 使用daemon.DaemonRunner(我们已经发现这个使用起来非常方便)
  • 变化进程文件pidfile的类型为daemon.pidfile.TimeoutPIDLockFile
+0

我尝试了第二个办法,是给予,甚至更坏的结果。工作目录中没有pid文件,它仍在抱怨它的存在!我通过strace确认 – auny

+0

strace给出了“open(”test.pid“,O_WRONLY | O_CREAT | O_EXCL,0644)= -1 EEXIST(File exists)” – auny