首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当存在过时的PID文件时,python-daemon上下文无法启动

当存在过时的PID文件时,python-daemon上下文无法启动
EN

Stack Overflow用户
提问于 2012-01-26 23:50:17
回答 2查看 6.3K关注 0票数 6

我正在使用python-daemon,并且有一个问题,当我kill -9一个进程时,它会留下一个pidfile (ok),下次我运行我的程序时,它不会工作,除非我已经手动删除了这个pidfile (不ok)。

我捕获所有异常,以便在终止之前调用context.close() --当这种情况发生时(例如在kill上),/var/ run /mydaemon.pid*文件将被删除,随后的守护进程将成功运行。但是,在使用SIGKILL (kill -9)时,我没有机会调用context.close(),/var/run文件仍然存在。在本例中,下一次我运行我的程序时,它没有成功启动--原始进程返回,但守护进程在context.open()阻塞。

看起来python-daemon应该注意到有一个不再存在的进程的pidfile,并将其清除,但这并没有发生。我是不是应该手工做这件事?

注意:我没有使用with,因为这段代码运行在Python2.4上

代码语言:javascript
复制
from daemon import DaemonContext
from daemon.pidlockfile import PIDLockFile

context = DaemonContext(pidfile = PIDLockFile("/var/run/mydaemon.pid"))
context.open()

try:
    retry_main_loop()
except Exception, e:
    pass
context.close()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-14 20:31:41

如果您运行的是linux,并且进程级锁是可以接受的,请继续阅读。

我们尝试获取锁。如果失败,请检查锁是否被正在运行的进程获取。如果不是,则打破锁定并继续。

代码语言:javascript
复制
from lockfile.pidlockfile import PIDLockFile
from lockfile import AlreadyLocked

pidfile = PIDLockFile("/var/run/mydaemon.pid", timeout=-1)
try:
    pidfile.acquire()
except AlreadyLocked:
    try:
        os.kill(pidfile.read_pid(), 0)
        print 'Process already running!'
        exit(1)
    except OSError:  #No process with locked PID
        pidfile.break_lock()

#pidfile can now be used to create DaemonContext

编辑:看起来PIDLockFile只在锁定文件>= 0.9上可用

票数 1
EN

Stack Overflow用户

发布于 2012-02-24 21:02:54

使用提供的脚本here,pid文件仍然是kill -9,但是脚本也会在重新启动时正确清除。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9020860

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档