6

您好,我正在使用 python-daemon 模块在 python 中编写一个守护程序,我的应用程序正确启动,创建了一个 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()
4

1 回答 1

9

我同意@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这个答案提到了这种将随机命名的文件硬链接到您的 pidlock 文件的方法在使用O_EXCL打开文件时使用的标志之前是一种文件锁定方法。

但令人讨厌的部分是该文件不包含您所说的 PID,并且文件名的 PID 与正确的 PID 相差几个数字,因此非常具有误导性。

于 2014-05-14T14:57:46.553 回答