<p><a href="https://pypi.python.org/pypi/python-daemon/" rel="nofollow">^{<cd1>}</a>库是<a href="http://legacy.python.org/dev/peps/pep-3143/" rel="nofollow">PEP 3143</a>“标准守护进程库”的参考实现,它通过在传递给<code>DaemonContext</code>对象的pid文件上使用文件锁(通过<a href="https://pypi.python.org/pypi/lockfile" rel="nofollow">^{<cd2>}</a>库)来处理此问题。底层操作系统保证在守护进程退出时释放文件锁,即使它不干净地退出。下面是一个简单的用法示例:</p>
<pre><code>import daemon
from daemon.pidfile import PIDLockFile
context = daemon.DaemonContext(
pidfile= PIDLockFile('/var/run/spam.pid'),
)
with context:
main()
</code></pre>
<p>因此,如果一个新实例启动,它就不必确定创建现有pid文件的进程是否仍在通过pid本身运行;如果它能够获取文件锁,那么其他实例就不会运行(因为它们已经获得了锁)。如果无法获取锁,则必须运行另一个守护进程实例。在</p>
<p>遇到麻烦的唯一方法是,如果有人在守护进程运行时手动删除了pid文件。但我认为你不必担心有人故意用这种方式破坏东西。在</p>
<p>理想情况下,<code>python-daemon</code>将是标准库的一部分,这也是pep3143的最初目标。不幸的是,政治公众人物被推迟了,基本上是因为没有人愿意实际完成加入标准库所需的剩余工作:</p>
<blockquote>
<p>Further exploration of the concepts covered in this PEP has been
deferred for lack of a current champion interested in promoting the
goals of the PEP and collecting and incorporating feedback, and with
sufficient available time to do so effectively.</p>
</blockquote>