Python:使用PID fi对进程进行守护

2024-06-17 11:21:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试使用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)

在这个过程被强行扼杀之前,这种痕迹一直存在。lock file函数确实检测到存在现有的锁文件,但问题是程序没有退出。另外,我希望显示这个错误,即pid文件已经存在。

怎么能做到?


Tags: 文件实例testimport程序timedefsys
1条回答
网友
1楼 · 发布于 2024-06-17 11:21:24

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

守护程序库附带了一个helper类daemonDaemonRunner,用于创建pid文件。从内部来看,它使用daemon.pidfile.TimeoutPIDLockFile作为锁文件的类型。

看来你可以通过以下两种方法来解决这个问题:

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

相关问题 更多 >