Python:用PID文件守护进程



我正在尝试使用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/daemon功能,我使用

启动该程序的另一个实例
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)

这个跟踪会一直出现,直到进程被强制终止。lockfile函数确实检测到存在一个现有的锁文件,但问题是程序没有退出。我也希望这个错误显示pid文件已经存在。

如何做到这一点?

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

守护进程库附带了一个辅助类daemonDaemonRunner,它处理创建pid文件。从内部来看,它使用daemon.pidfile.TimeoutPIDLockFile作为lockfile的类型。

所以,看起来你可以用以下两种方法来解决这个问题:

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

相关内容

  • 没有找到相关文章

最新更新