python脚本的守护进程与新贵

Posted

技术标签:

【中文标题】python脚本的守护进程与新贵【英文标题】:Daemon vs Upstart for python script 【发布时间】:2013-07-18 19:53:13 【问题描述】:

我用 Python 编写了一个模块,希望它在启动后连续运行,当我需要更新其他模块时需要停止它。如果模块已崩溃或未运行,我可能会使用 monit 重新启动它。

我正在使用不同的技术,例如 Daemon、Upstart 和许多其他技术。

最好的方法是让我在所有新模块中都使用这种方法来永远运行它们?

【问题讨论】:

【参考方案1】:

根据您提到的 Upstart,我假设这个问题是针对在 Ubuntu 服务器上运行的服务。

在 Ubuntu 服务器上,upstart 作业确实是创建始终在线服务的最简单和最方便的选择,该服务在正确的时间启动并且可以使用熟悉的命令停止或重新加载。

要创建新贵服务,您需要将单个文件添加到/etc/init。呼叫<service-name>.conf。示例脚本如下所示:

description "My chat server"
author "your@email-address.com"

start on runlevel [2345]
stop on runlevel [!2345]

env AN_ENVIRONMENTAL_VARIABLE=i-want-to-set

respawn

exec /srv/applications/chat.py

这意味着每次启动机器时都会启动chat.py 程序。如果它因任何原因死亡,它将重新启动它。您不必担心双重分叉或以其他方式守护您的代码。这是暴发户为你处理的。

如果您想停止或开始您的流程,您可以使用

service chat start 
service chat stop

名称chat是自动从/etc/init内的.conf文件的名称中找到的

我在这里只介绍暴发户的基础知识。还有许多其他功能使其更加有用。运行 man upstart 即可获取所有信息。

这种方法比编写自己的守护程序代码方便得多。一个 4-8 行的 Ubuntu 内置组件配置文件比让你的代码安全地双叉,然后让另一个进程监视它以确保它不会消失要少得多。

Monit 有点像红鲱鱼。如果您想要停机警报,无论如何您都需要在独立服务器上运行监控程序。依靠 upstart 来保持进程始终在服务器上运行。然后有一个不同的服务来确保服务器实际运行。停机时间有很多不同的原因。如果服务器本身出现故障,在同一台服务器上运行的进程将不会告诉您任何信息。您需要一台单独的机器(或第三方提供商,如 pingdom)来提醒您该情况。

【讨论】:

是否有任何真实来源支持您的答案?在 Ubuntu 上运行是一个选项,但不是强制性的(daemonize 将同时在两者上运行)。其次,即使是暴发户,您也必须使用 monit 来获取停机警报。 您可以在新贵停止/启动时向您发送电子邮件 (serverfault.com/questions/236925/…)。真实来源?人们到处都在生产中使用新贵。我们在生产中使用 upstart 您不能将 monit 用于停机警报。没有用。原因请参见编辑后的答案。 很棒的帖子。 Upstart 位于 Debian 树中,因此它可能可以在 vanilla debian 或 Mint 以及其他衍生产品中使用。 只是交叉引用下面的帖子,因为这是我自己解决这个问题时使用的答案之一。基本上,您可以使用 python-daemon 轻松创建适当的守护程序,然后将其作为服务运行,但有一些问题:***.com/a/21768620/1400991 基本上你需要仔细弄清楚在你运行命令之后会发生什么,它是fork(创建一个新的子进程)吗?如果它确实分叉。它分叉一次还是两次?新贵食谱很好地解释了这一点:upstart.ubuntu.com/cookbook/#expect.【参考方案2】:

您可以查看supervisor。它的能力是在系统启动时启动一个进程,然后保持它处于活动状态直到关闭。

最简单的配置文件是:

[program:my_script]
command = /home/foo/bar/venv/bin/python /home/foo/bar/scripts/my_script.py
environment = MY_ENV_VAR=FOO, MY_OTHER_ENV_VAR=BAR
autostart = True
autorestart = True

然后你可以把它链接到/etc/supervisord/conf.d,运行sudo supervisorctl进入supervisor的管理控制台,输入reread以便supervisor注意到新的配置条目,updatestatus列表中显示新程序.

要启动/重新启动/停止程序,您可以执行sudo supervisorctl start/restart/stop my_script

【讨论】:

给读者的一般注意事项,supervisor 不适用于 Python 3。【参考方案3】:

我使用带有 start-stop-daemon 实用程序的老式 initscript。查看 /etc/init.d 中的 skel

【讨论】:

以上是关于python脚本的守护进程与新贵的主要内容,如果未能解决你的问题,请参考以下文章

python 守护进程类的python脚本

Python 守护进程和 systemd 服务

Python实例浅谈之五Python守护进程和脚本单例运行

python学习笔记——守护进程

Erlang:守护进程“init.d”脚本无法启动

用shell写一个守护进程脚本