2011-08-11 15 views
5

我刚完成我的应用程序,并想部署它。但是,如何运行我的应用程序作为服务/ deamon?在appengine之外运行webapp2,如何将它作为service/deamon运行?

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

任何一个这样做?有最佳实践方法吗?

..fredrik

+0

你为什么要将它作为守护进程运行? – moraes

+0

运行'python main.py&'似乎有点不安全。如果它失败/崩溃,我会自动重启也会让deamon写入一个日志文件。 – fredrik

+0

@fredrik我添加了关于崩溃处理和日志到我的答案的详细信息 – MatToufoutu

回答

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 &)重定向它或处理来自应用的日志记录。

+0

谢谢。关于日志记录:当我运行'python main.py'时,它显示“在http://127.0.0.1:8080上投放”。但是当我运行'sudo python main.py&> /var/log/apns.log&'没有在日志文件中添加任何内容。在main.py中尝试'logging.info('started')'。日志文件没有任何反应(但服务器启动okey)。任何想法? – fredrik

+0

@fredrik也许你的应用没有写入/ var/log的权限 – MatToufoutu

+0

@agf:'&>'已经重定向stdout和stderr – MatToufoutu

2

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

+0

http://packages.ubuntu.com/supervisor | http://packages.gentoo.org/package/app-admin/supervisor | http://aur.archlinux.org/packages.php?K=supervisor | http://rpm.pbone.net/index.php3?stat=3&search=supervisor *(编辑格式)* – iki

1

妖魔化一个python脚本实际上是妖魔化蟒蛇。

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

启动一个屏幕,运行你的程序,分离,然后注销,如果你愿意,它会留下一个守护进程的过程。这种方法尤其在您的程序正在构建时非常有效,不是非常稳定,或者为了调试而倾倒许多快速编写的消息。

在守护程序中还有一些事情需要注意,比如将工作目录更改为/并关闭未使用的描述符,以防必须卸载文件系统或重新编程信号句柄等。 ,如果您从初始化或干净的登录会话守护进程,大多数条件都会得到满足;只要记住将目录改为“/”,通常就足够了。

但是使用屏幕并没有帮助生存崩溃,崩溃总是程序员必须处理的。