您好我正在python中编写一个使用python-daemon模块的守护进程,我的应用程序正确启动,创建了一个pidfile.lock,但没有包含进程ID的pidfile的标志。
import daemon
import lockfile
import perfagentmain
context = daemon.DaemonContext(
working_directory='/opt/lib/perf-agent',
umask=0o002,
pidfile=lockfile.FileLock('/var/run/perf-agent.pid')
)
with context:
perfagentmain.start()
答案 0 :(得分:6)
我同意@npoektop对该解决方案的评论。我只想说在我写这篇文章的时候daemon.pidlockfile
不存在。而是daemon.pidfile
。也许这是最近改名的名字?
相反,这是使用daemon.pidfile
模块而不是lockfile
模块的一般解决方案。
import daemon
import daemon.pidfile
import perfagentmain
context = daemon.DaemonContext(
working_directory='/opt/lib/perf-agent',
umask=0o002,
pidfile=daemon.pidfile.PIDLockFile('/var/run/perf-agent.pid')
)
with context:
perfagentmain.start()
和@Martino Dino,你是绝对正确的,似乎lockfile
模块有一个完全不同的写锁文件的实现。 (即使python-daemon
实际需要lockfile
)
当我根据自己的需要试用pidfile = lockfile.FileLock('/var/run/mydaemon.pid')
时,我看到了一个名为<MY_MACHINE_NAME>-<8CHAR_HEX_ID>.<PID_OFF_BY_2>
的文件以及一个文件/var/run/mydaemon.pid.lock
。 This answer提到在使用打开文件时使用的O_EXCL
标志之前,将随机命名的文件硬链接到pidlock文件的方法是文件锁定方法。
但令人讨厌的部分是文件没有像你说的那样包含PID,并且文件名的PID被一些正确的PID 关闭了,所以它非常糟糕误导。