6

我正在使用python-daemon,并且遇到一个问题,当我kill -9处理一个进程时,它会留下一个pidfile(好的),并且下次我运行我的程序时它不起作用,除非我已经手动删除了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()
4

2 回答 2

1

如您所说,使用此处提供的脚本 ,pid 文件仍保留在 kill -9 上,但脚本也会在重新启动时正确清理。

于 2012-02-24T13:02:54.007 回答
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

于 2014-05-14T12:31:41.140 回答