我正在使用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上
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()
发布于 2014-05-14 12:31:41
如果您运行的是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只在锁定文件>= 0.9上可用
发布于 2012-02-24 13:02:54
使用提供的脚本here,pid文件仍然是kill -9,但是脚本也会在重新启动时正确清除。
https://stackoverflow.com/questions/9020860
复制相似问题