在Google上搜索会发现x2代码段。第一个结果是该代码配方的内容,其中包含大量文档和说明,并在下面进行了一些有用的讨论。
但是,另一个代码示例虽然没有包含太多文档,但包含用于传递命令(例如启动,停止和重新启动)的示例代码。它还会创建一个PID文件,可以方便地检查守护程序是否已在运行等。
这些示例都说明了如何创建守护程序。还有其他需要考虑的事情吗?一个样本比另一个样本好吗,为什么?
当前解决方案
PEP 3143(标准守护程序进程库)的参考实现现已作为python-daemon提供。
历史答案
Sander Marechal的代码示例优于最初于2004年发布的原始代码示例。我曾经为Pyro提供了一个守护程序,但如果不得不这样做,可能会使用Sander的代码。
成为行为良好的守护进程时,有很多事情要注意:
防止核心转储(许多守护程序以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或更高版本。