我正在使用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()
答案 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
上可用