我已经用 Python 编写了一个模块,并希望它在启动后连续运行,并且在我需要更新其他模块时需要停止它。如果模块已崩溃或未运行,我可能会使用 monit 重新启动它。
我正在经历不同的技术,如Daemon、Upstart和许多其他技术。
哪个是最好的方法,以便我在所有新模块中使用这种方法来永远运行它们?
从你提到的 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
.conf
是从里面的文件名中自动找到的/etc/init
我在这里只介绍暴发户的基础知识。还有许多其他功能使其更加有用。都可以通过运行获得man upstart
。
这种方法比编写自己的守护程序代码方便得多。一个 4-8 行的 Ubuntu 内置组件配置文件比让你的代码安全地双叉,然后让另一个进程监视它以确保它不会消失要少得多。
Monit有点像红鲱鱼。如果您想要停机警报,无论如何您都需要在单独的服务器上运行监控程序。依靠 upstart 来保持进程始终在服务器上运行。然后有一个不同的服务来确保服务器实际运行。停机时间有很多不同的原因。如果服务器本身出现故障,在同一台服务器上运行的进程将不会告诉您任何信息。您需要一台单独的机器(或第三方提供商,如 pingdom)来提醒您该情况。
您可以查看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注意到新的配置条目并update
在status
列表中显示新的程序。
要启动/重新启动/停止您可以执行的程序sudo supervisorctl start/restart/stop my_script
。
我使用带有 start-stop-daemon 实用程序的旧式 initscript。查看 /etc/init.d 中的 skel