定期重启子进程的Supervisord设置方法

36

我正在使用Supervisor (3.0a12)在Ubuntu 12.04上管理php gearman工作者。有时候工作者会陷入一种奇怪的状态,耗费大量CPU和RAM。当我解决这个问题时,我觉得让Supervisor定期自动杀死和刷新工作者会很不错。我查看了配置文档,但似乎没有找到任何允许这样做的选项。

请问是否有人知道如何让supervisord定期重新启动所有进程?

3个回答

37

您可以使用crontab直接向supervisorctl传递命令。例如,以下命令将每20分钟重新启动一个进程。

0,20,40 * * * * /path/to/supervisorctl restart [supervisor_process]

这将重新启动进程,但我怀疑它可能会杀死正在运行的良好进程,因此可能会导致这些进程的数据丢失。(例如,对于工作进程而不仅仅是无状态应用程序) - tristanbailey
6
进程会因为多种原因而终止,而对于意外重启的鲁棒性来说至关重要。因此,如果这种策略会导致数据丢失,那么无论使用 cron 来实现是否正确,都应该视为错误。 - jma
我给它点了踩,如果supervisorctl失败了怎么办?谁来重新启动它?应用程序可能会永远不加载。为什么它没有包含在supervisord中呢? - Alexis

31

superlance 提供了一个针对 supervisor 的 memmon 插件memmon 可以监控受 supervisor 控制的程序的内存使用情况。

可以将 memmon 配置为 supervisor 的事件监听器:

[eventlistener:memmon]
command=memmon -a 200MB
events=TICK_60

以上配置将 memmon 设置为监控受 supervisor 控制的 任何 程序,如果其内存使用超过 200MB,则会重新启动。它每隔 60 秒进行检查。

您可以配置 memmon 监控特定的程序或程序组,并为每个程序设置限制。


如果我使用Supervisor来启动一个名为“xvfb-run”的进程,该进程又启动了另一个进程(比如XUL Runner),那么memmon只记录xvfb使用的内存还是所有子进程的内存? - CMCDragonkai
快速扫描memmon代码库显示它通过RPC查询supervisord管理的程序列表,并直接查看pids。我想你需要扩展它以查看这些pids的子进程。 - Martijn Pieters
我认为我找到了一个针对memmon的pull request来解决这个问题。它表示将会追踪“进程树”。https://github.com/Supervisor/superlance/issues/21 - CMCDragonkai
只有一个问题,如果我有一个使用numprocs=X的监管程序部分,其中X是大于1的任何数字。 memmon会跟踪该程序部分中所有进程的进程使用情况,还是每个进程单独跟踪? - CMCDragonkai
1
源代码按PID跟踪内存,没有在多个PID之间累积内存。 - Martijn Pieters
显示剩余2条评论

18

这里有一个仅供主管使用的简单解决方案。创建另一个主管进程,让它睡眠适当的时间,然后重新启动您想要的进程。

[program:my_program]
process_name = python something.py

[program:periodicrestarter]
command = sh -c "echo 'restart my_program' | supervisorctl;sleep 600"
; restarts all (sleeps first because this restarts itself):
;command = sh -c "sleep 600; echo 'restart all' | supervisorctl"
autorestart = true

当唯一的重启原因不是高内存使用时,这是一个很好的替代方案。 - HosseyNJF
3
简要说明:注意,“restart all”会重新启动“periodicrestarter”本身,因此它可能无法按预期工作。 Translated: 简短提示:请注意,“restart all”还会重新启动“periodicrestarter”本身,因此可能导致其无法按预期工作。 - bvitya
2
在容器上下文中使用加号,不使用crontab。 - Nicolas Bonnici

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接