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

kdt*_*kdt 6 python daemon python-daemon

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

我按照context.close()在终止之前调用的顺序捕获所有异常- 当发生这种情况时(例如在a上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()
Run Code Online (Sandbox Code Playgroud)

Par*_*ras 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
Run Code Online (Sandbox Code Playgroud)

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