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)
如果您运行的是 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 上可用