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

时间:2012-01-26 15:50:17

标签: python daemon python-daemon

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

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

似乎python-daemon应该注意到有一个不再存在的进程的pidfile,并清除它,但这不会发生。我本来应该这样做吗?

注意:我没有使用with,因为此代码在Python 2.4上运行

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

2 个答案:

答案 0 :(得分:1)

使用提供的脚本here 正如你所说,pid文件仍然在kill -9上,但脚本在重启时也会正常清理。

答案 1 :(得分:1)

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

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

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仅在lockfile> = 0.9

上可用