一尘不染

如何在Python中创建守护程序?

python

在Google上搜索会发现x2代码段。第一个结果是该代码配方的内容,其中包含大量文档和说明,并在下面进行了一些有用的讨论。

但是,另一个代码示例虽然没有包含太多文档,但包含用于传递命令(例如启动,停止和重新启动)的示例代码。它还会创建一个PID文件,可以方便地检查守护程序是否已在运行等。

这些示例都说明了如何创建守护程序。还有其他需要考虑的事情吗?一个样本比另一个样本好吗,为什么?


阅读 367

收藏
2020-02-12

共2个答案

一尘不染

当前解决方案

PEP 3143(标准守护程序进程库)的参考实现现已作为python-daemon提供。

历史答案

Sander Marechal的代码示例优于最初于2004年发布的原始代码示例。我曾经为Pyro提供了一个守护程序,但如果不得不这样做,可能会使用Sander的代码。

2020-02-12
一尘不染

成为行为良好的守护进程时,有很多事情要注意:

  • 防止核心转储(许多守护程序以root身份运行,并且核心转储可以包含敏感信息)

  • 在chroot监狱中表现正确

  • 根据使用情况适当设置UID,GID,工作目录,umask和其他过程参数

  • 放弃提升suid,sgid特权

  • 关闭所有打开的文件描述符,并根据用例进行排除

  • 正确的行为,如果启动一个已经脱离上下文中,如init,inetd等

  • 为明智的守护程序行为设置信号处理程序,还可以根据用例确定特定的处理程序

  • 重定向标准流stdin,stdout,stderr因为守护进程不再具有控制终端

  • 将PID文件作为合作咨询锁处理,它本身就是蠕虫的完整罐,具有许多相互矛盾但有效的行为方式

  • 在进程终止时允许适当的清理

  • 实际上成为守护进程,而不会导致僵尸

其中一些是标准的,如规范的Unix文献所述(UNIX环境中的Advanced Programming,已故W. Richard Stevens,Addison-Wesley,1992年)。其他(例如流重定向和PID文件处理)是大多数守护程序用户期望的常规行为,但标准化程度较低。

PEP 3143 “标准守护程序进程库”规范涵盖了所有这些内容。该蟒蛇守护参考实现工作在Python 2.7版或更高版本,和Python 3.2或更高版本。

2020-02-12