你好,我正在用 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()
最佳答案
我同意@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提到这种将随机命名的文件硬链接(hard link)到您的 pidlock 文件的方法在使用 O_EXCL
之前是一种文件锁定方法。打开文件时使用的标志。
但烦人的是文件没有像你说的那样包含 PID,文件名有一个 PID,它与正确的 PID 相差几个数字,所以它非常糟糕误导。
关于Python守护进程没有pidfile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17909754/