我正在尝试使用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文件已存在的错误。
如何做到这一点?
答案 0 :(得分:2)
注意:此答案假设您使用的是python-daemon
库。
守护程序库附带一个辅助类daemonDaemonRunner
,用于处理创建pid文件。查看其内部结构,它使用daemon.pidfile.TimeoutPIDLockFile
作为锁定文件的类型。
所以,看起来你可以通过以下方式解决这个问题:
daemon.DaemonRunner
(我们发现这非常方便使用)daemon.pidfile.TimeoutPIDLockFile
。