在app引擎之外运行webapp2,如何将其作为服务/守护进程运行?

时间:2011-08-11 08:33:15

标签: python webapp2

我刚刚完成了我的应用,想要部署它。但是如何将我的应用程序作为服务/ deamon运行?

谷歌搜索显示了一些不同的approches使用了一些python库,扭曲和Can I run a Python script as a service?。但无法弄清楚该怎么做。

有人这样做过吗?有最佳实践方法吗?

..弗雷德里克

3 个答案:

答案 0 :(得分:4)

由于您希望应用程序独立运行(如果我理解正确),您可以像处理任何其他(非Web)应用程序一样处理此问题。

如果您只是希望您的程序在后台运行,您可以阅读this receipe,其中解释了如何创建守护程序应用程序并对此主题进行了很好的讨论(在注释中)。

另一方面,如果你想用你的app创建一个“系统守护进程”(从每个系统的启动开始),我会选择一个shell脚本。要了解如何为系统创建启动脚本,您可以从计算机上的其他启动脚本中获取灵感。解决方案是使用python my_app.py &(来自启动脚本)在后台运行您的程序,然后使用$!变量来获取进程'pid并将其存储到文件中,这样您就可以了也可以通过阅读“pid文件”来停止您的流程并使用kill命令(向您的流程发送SIGINT将在您的应用程序中引发KeyboardInterrupt异常)。

修改

在您的问题评论中,您说使用python main.py &会不安全,因为如果应用程序失败/崩溃将无法重新启动,但这与您系统上的任何其他守护程序相同(例如,如果Apache崩溃,它不会自行重启)。如果要在崩溃时重新启动应用程序,则必须编写第二个守护程序,如果应用程序仍在运行,它将定期检查,并在需要时重新启动它。

关于日志记录事项,您可以使用logging模块将应用程序输出到stdout/stderr并从启动脚本(python main.py &> /path/to/app.log &)重定向它或处理来自应用程序的日志记录

答案 1 :(得分:2)

或者,您可以使用supervisord轻松运行和控制deamonized进程并记录其stdout / stderr输出。

答案 2 :(得分:1)

演示python脚本实际上是在欺骗python。

如果您是root用户,请考虑使用GNU屏幕来完成这项工作。屏幕本身将处理终端控制,这通常是构建守护进程最复杂的任务。

启动屏幕,运行程序,分离,然后根据需要注销,它将留下类似守护进程的过程。这种方法非常有效,特别是当您的程序正在构建中,不是很稳定,或者转储许多快速编写的消息以进行调试时。

在守护程序时仍有一些注意事项,例如将工作目录更改为/和关闭未使用的描述符,以防您必须卸载文件系统,或重新编程信号句柄,等等。但是,如果从init或干净登录会话守护进程,则满足大多数条件;只记得将目录更改为“/”,通常就够了。

但是使用屏幕无助于在崩溃中幸存,崩溃总是程序员必须处理的。