Python:使用PID文件的守护进程
我正在尝试使用Python:使用PID文件的守护进程,python,daemon,pid,lockfile,Python,Daemon,Pid,Lockfile,我正在尝试使用守护进程模块对进程进行守护。代码看起来像这样 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,
守护进程
模块对进程进行守护。代码看起来像这样
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)
这个痕迹会一直出现,直到这个过程被强制终止。lockfile函数确实检测到存在现有的锁文件,但问题是程序没有退出。我还希望显示此错误,说明pid文件已经存在
如何做到这一点?注意:这个答案假设您使用的是
python守护程序库
守护程序库附带一个帮助程序类daemonDaemonRunner
,用于处理创建pid文件的操作。从内部来看,它使用daemon.pidfile.TimeoutPIDLockFile
作为锁文件的类型
因此,看起来您可以通过以下任一方法解决此问题:
- 使用
daemon.DaemonRunner
(我们发现它使用起来非常方便)
- 将pidfile的类型更改为
daemon.pidfile.TimeoutPIDLockFile
我尝试了第二种方法,结果更糟。工作目录中没有pid文件,它仍在抱怨它的存在!我通过StratesTrace确认了“open”(“test.pid”,O|WRONLY | O|u CREAT | O|u EXCL,0644)=-1eexist(文件存在)