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/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)

而且这个痕迹会一直出现,直到进程被强行杀死。锁定文件功能确实检测到存在现有锁定文件,但问题是程序没有退出。我也希望显示这个错误,表明 pid 文件已经存在。

如何才能做到这一点?

4

1 回答 1

2

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

守护程序库带有一个帮助程序类daemonDaemonRunner,用于处理创建 pid 文件。查看其内部结构,它daemon.pidfile.TimeoutPIDLockFile用作锁定文件的类型。

所以,看起来你可以通过以下方式解决这个问题:

  • 使用daemon.DaemonRunner(我们发现这个使用起来非常方便)
  • 将 pidfile 的类型更改为daemon.pidfile.TimeoutPIDLockFile.
于 2013-06-20T13:44:05.617 回答