如果我们使用PEP-3143及其参考实施http://pypi.python.org/pypi/python-daemon 然后看起来不可能让Twisted工作,因为在守护进程期间所有可能的文件处理程序都是显式关闭的,其中包括管道。
当Twisted尝试调用os.pipe()
然后写入它时 - 获取错误的文件描述符。
在我看来,守护进程不适合这个PEP的联网? 也许这就是扭曲存在的原因
编辑:
我必须指出,问题更多的是“为什么PEP实际上无法创建网络应用程序”,而不是“如何做到”。
Twisted打破了这个规则以便工作
答案 0 :(得分:2)
它不会关闭所有打开的文件描述符:只是那些不在files_preserve
属性中的文件描述符。您可以通过弄清楚Waker的FD和反应堆中所有打开的插座,然后将其传递给files_preserve
来强迫它工作......但为什么要这么麻烦?只需使用twistd
并自行扭曲守护进程。
更好的是,使用twistd -n
并让您的进程受到其他系统工具的监控,并且根本不需要使用守护进程。
答案 1 :(得分:1)
supervisord
+ upstart
答案 2 :(得分:1)
随意使用此守护程序http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/
如何将它与Twisted混合看到这里
http://michael-xiii.blogspot.com/2011/10/twisted.html(警告!俄语文本未来,但Python代码正在证明)
答案 3 :(得分:0)
关闭所有打开的文件描述符的做法是一种影响,即deamonizing进程从父进程继承了一些打开的文件。例如,您可以在一个进程中打开许多文件(例如,使用os.open()
),然后调用继承它们的子进程。您可能没有一种简单的方法,作为子进程,从父进程知道哪些文件描述符是有用的(除非您将它与命令行参数一起传递),并且您当然不希望stdin,stdout或stderr,所以在做任何其他事情之前,完全合理地关闭所有打开的文件。
然后,一个deamonizing过程将采取一些额外的步骤,成为一个deamon(如PEP中所述)。
一旦该进程与任何类型的终端完全分离,它就可以根据需要启动打开文件和连接。它将打开其日志文件,配置文件和网络连接。
其他人已经提到过扭曲,通过twistd
工具已经很好地完成了这一切,而且你不需要使用额外的模块。如果您不想使用twistd
(由于某种原因)但您确实想要使用twisted,您可以使用外部的东西,但是您应该首先将 deamonize 然后导入twisted和其余的应用程序代码和最后打开的网络连接。