【问题标题】:Running webapp2 outside of appengine, how to run it as a service/deamon?在应用引擎之外运行 webapp2,如何将其作为服务/守护进程运行?
【发布时间】:2011-10-24 18:40:11
【问题描述】:

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

谷歌搜索显示了一些使用一些 python 库的不同方法,twisted 和 Can I run a Python script as a service?。但不知道该怎么做。

有人做过吗?是否有最佳实践方法?

..弗雷德里克

【问题讨论】:

  • 为什么要将它作为守护进程运行?
  • 使用python main.py & 运行似乎有点不安全。如果它失败/崩溃,我希望它自动重启,也让守护进程写入日志文件。
  • @fredrik 我在我的答案中添加了有关崩溃处理和日志记录的详细信息

标签: python webapp2


【解决方案1】:

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

如果您只想让您的程序在后台运行,您可以阅读this receipe,它解释了如何创建守护程序应用程序,并就该主题进行了很好的讨论(在 cmets 中)。

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

编辑:

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

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

【讨论】:

  • 谢谢。关于日志记录:当我运行python main.py 时,它会显示“在127.0.0.1:8080 上服务”。但是当我运行sudo python main.py &> /var/log/apns.log & 时,日志文件中没有添加任何内容。还在 main.py 中尝试了logging.info('started')。日志文件没有任何反应(但服务器启动正常)。有什么想法吗?
  • @fredrik 也许你的应用没有权限写入 /var/log
  • 不应该sudo 看看吗?
  • 是的,使用 sudo 应该可以。您使用的是哪个版本的 bash? &> 重定向仅从 Bash4 开始可用,如果您使用 3.x,则必须分别重定向 stdout 和 stderr (python main.py 1>/dir/app.log 2>/dir/app.log &)
  • sudo 不允许您访问重定向后的内容,是吗?你必须sudo app 2>&1 | sudo tee /dir/app.log
【解决方案2】:

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

【解决方案3】:

妖魔化python脚本其实就是妖魔化python。

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

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

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

但是使用屏幕并不能帮助在崩溃中幸存下来,崩溃始终是程序员必须处理的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-02
    • 2011-02-15
    • 2015-07-12
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多