Answers:
我不熟悉此功能,但是,如果要解决这个问题是我的任务,并且很短的手册页阅读没有提供简单的旋钮来调节此行为,请执行以下操作:
要么扩展现有的服务启动脚本,要么繁琐的工作,在链中插入一个新的启动脚本(反过来启动原始的启动脚本)。而不是立即启动服务,新的启动脚本应检查最近一次启动是否足够近。这可以通过检查先前启动创建的信令文件来完成。如果该文件不存在,则脚本可以继续并触摸该文件并启动服务。如果文件存在,脚本应检查文件是否足够旧。如果不够旧,则应循环等待(休眠),直到文件足够旧为止。
这样的事情可能会起作用(两次重启之间至少要等待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...
我真的不喜欢基于init的流程管理(而runit基本上是init的替代品)。正如您所发现的那样,一旦失败的进程一死就立即重启并不是一个特别好的策略。我已经使用init来重新启动monit,但是就目前而言。(潜在的OOM杀手可能杀死监视)。
因此,我鼓励您寻找替代产品,而不是修补问题。
Monit已经很老了,但它做得很好,而且我还不知道有什么更好的配合。它具有一个不错的功能,即在启动后不需要分配更多的内存,因此,用脚本语言编写的任何内容都可以避免。您想要的最后一件事是您的进程监视器快要死了,因为它无法获得内存。