如何控制Runit服务的自动重启速率?


8

我有这个runit服务runlog/run脚本的正常工作。

碰巧的是,该服务本身可能由于外部原因而崩溃,并且可能无法启动很多分钟。runit处理这种情况的默认方式是每隔几秒钟重新启动一次服务。我该如何改变这种行为?

我最后的见解是在其中添加check脚本并做一些魔术,但似乎比应该做的要复杂得多。有没有更好的简单方法?

Answers:


3

我不熟悉此功能,但是,如果要解决这个问题是我的任务,并且很短的手册页阅读没有提供简单的旋钮来调节此行为,请执行以下操作:

要么扩展现有的服务启动脚本,要么繁琐的工作,在链中插入一个新的启动脚本(反过来启动原始的启动脚本)。而不是立即启动服务,新的启动脚本应检查最近一次启动是否足够近。这可以通过检查先前启动创建的信令文件来完成。如果该文件不存在,则脚本可以继续并触摸该文件并启动服务。如果文件存在,脚本应检查文件是否足够旧。如果不够旧,则应循环等待(休眠),直到文件足够旧为止。

这样的事情可能会起作用(两次重启之间至少要等待1分钟):

#!/bin/bash

SIGNALDIR=/tmp
SIGNALFILE=service.started

while /bin/true; do
        found=`find "${SIGNALDIR}" -maxdepth 1 -name "${SIGNALFILE}" -mmin -1 | wc -l`
        [ "${found}" -eq 0 ] && break
        echo "Waiting"
        sleep 10
done

touch "${SIGNALDIR}/${SIGNALFILE}"
original service start...

那是个好方法。一旦测试,我将对脚本进行任何可能的必要更正。
jpbochi 2014年

8

您应该在该./finish服务的文件中限制重新启动的速率,该服务在异常终止时运行。该./finish脚本./run将从那里接收返回代码,您可以确定该怎么做,等等。为此,您应该让您的./finish脚本大声尖叫有关失败的信息,并发送通知并四处跳跃...


谢谢,这是正确的答案,但是不幸的是,使用python,ruby等的现代程序员似乎总是编写的应用程序根本不注意Unix信号,甚至根本不提供正确的退出代码。
figtrap

1
我猜返回的错误代码显然是“不爽的”吗?
艾利·佩恩

看起来是这么回事。我个人认为这是一大步。
figtrap

1

我真的不喜欢基于init的流程管理(而runit基本上是init的替代品)。正如您所发现的那样,一旦失败的进程一死就立即重启并不是一个特别好的策略。我已经使用init来重新启动monit,但是就目前而言。(潜在的OOM杀手可能杀死监视)。

因此,我鼓励您寻找替代产品,而不是修补问题。

Monit已经很老了,但它做得很好,而且我还不知道有什么更好的配合。它具有一个不错的功能,即在启动后不需要分配更多的内存,因此,用脚本语言编写的任何内容都可以避免。您想要的最后一件事是您的进程监视器快要死了,因为它无法获得内存。


EL7和大多数其他发行版中包含的systemd 可以在本地处理这种情况以及具有大量选项的各种类似情况,并且大多数情况下使诸如此类的过程管理器过时。
迈克尔·汉普顿

1
在少数情况下,对于目标环境,systemd可能“太大”。以前的“通过重启直到运行来进行过程管理”的旧方法已被适当的依赖关系解决方案所取代。有关示例,请参见skarnet.org/software/s6-rcjjacky.com/anopa
艾利·佩恩
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.