如何控制runit服务的自动重启速度?

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

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

我最后的见解是添加一个check脚本,并在那里做一些魔术,但似乎比它应该更复杂。 有更简单的方法吗?

我不熟悉这个工具,但是,如果这是我的任务来解决这个问题,并且一个非常短的手册阅读没有提供一个简单的旋钮来调整这种行为,我会做以下事情:

要么扩展现有的服务启动脚本,要么是繁琐的,将一个新的启动脚本插入链(反过来启动原始启动脚本)。 新的启动脚本不应该马上启动服务,而应该检查最近一次启动是否发生了。 这可以通过检查由上次启动创build的信令文件来完成。 如果文件不存在,脚本可以继续并触摸文件并启动服务。 如果文件存在,脚本应检查文件是否足够长。 如果它不够大,它应该等待(睡眠),直到文件变得足够老。

像这样的东西可能会工作(重新启动之间至less等待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... 

您应该限制您的重新启动./finish文件中的该服务,这是exception终止运行。 ./finish脚本将从./finish接收返回代码,并从那里确定要做什么等等。对于这个问题,你应该让你的./finish脚本大声尖叫,关于失败,发送通知和跳转着火…

我真的不是基于init的进程pipe理的粉丝(而runit基本上是init的替代品)。 正如你所发现的那样,一旦失败的进程一意孤行地重新启动就不是一个特别好的策略。 我已经使用init来重新启动monit,但是就这一点而言。 (潜在的OOM杀手可能会杀死monit)。

所以,我鼓励你去寻找替代品,而不是去补贴。

Monit已经很老了,但是它做得很好,而且我不知道有什么更好的事情发生。 它具有在启动后不需要malloc更多内存的好处,所以可以省去用脚本语言编写的任何东西。 你想要的最后一件事是你的进程监视器死亡,因为它无法获得内存。