Python: 使用PID文件将进程变为守护进程

5

我正在尝试使用daemon模块将进程变为守护进程。代码大致如下:

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/Talha@Fedora14-4e1a9720.21520", {st_mode=S_IFREG|0666,
 st_size=0, ...}) = 0
 select(0, NULL, NULL, NULL, {0, 100000}) = 0 (Timeout)

 link("/some-path-here/Talha@Fedora14-  4e1a9720.21520", 
 "/somepath/test.pid.lock") = -1 EEXIST (File exists)

直到强制杀死进程,这个跟踪信息会一直出现。锁定文件函数确实检测到已存在的锁定文件,但问题是程序不退出。我希望显示这个错误,即pid文件已经存在。

怎么做呢?

1个回答

2

注意:本答案假设您正在使用python-daemon库。

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

因此,您可以通过以下两种方式之一来解决问题:

  • 使用daemon.DaemonRunner(我们发现这非常方便)
  • 将pidfile类型更改为daemon.pidfile.TimeoutPIDLockFile

我尝试了第二种方法,但结果更糟。工作目录中没有pid文件,但它仍在抱怨其存在!我通过strace确认了这一点。 - auny
strace显示"open("test.pid", O_WRONLY|O_CREAT|O_EXCL, 0644) = -1 EEXIST (File exists)" - auny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接