¿Cómo controlar la tasa de reinicios automáticos de un servicio runit?

8

Tengo este servicio runit con runy log/runscripts funcionando correctamente.

De hecho, el servicio en sí puede bloquearse por razones externas y es posible que no pueda iniciarse durante muchos minutos. La forma predeterminada en que runit maneja esta situación es reiniciando el servicio cada dos segundos. ¿Cómo cambio este comportamiento?

Mi última idea fue agregar un checkscript y hacer algo de magia allí, pero parece mucho más complicado de lo que debería ser. ¿Hay una mejor manera más simple?

jpbochi
fuente

Respuestas:

3

Sin embargo, no estoy familiarizado con este servicio, si mi tarea fuera resolver este problema, y ​​una lectura muy breve de la página del manual no ofrecía una simple perilla para ajustar este comportamiento, haría lo siguiente:

Extienda el script de inicio del servicio existente o, si eso es engorroso, inserte un nuevo script de inicio en la cadena (que a su vez inicia el script de inicio original). En lugar de iniciar el servicio de inmediato, la nueva secuencia de comandos de inicio debe verificar si el último inicio se produjo recientemente. Esto se puede hacer comprobando un archivo de señalización creado por el inicio anterior. Si el archivo no existe, la secuencia de comandos puede continuar y tocar el archivo e iniciar el servicio. Si el archivo existe, el script debe verificar si el archivo es lo suficientemente antiguo. Si no tiene la edad suficiente, debe esperar (dormir) en un bucle hasta que el archivo tenga la edad suficiente.

Algo como esto podría funcionar (espera al menos 1 minuto entre reinicios):

#!/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...
Laszlo Valko
fuente
Ese es un buen enfoque. Tan pronto como lo pruebe, veré el script con las posibles correcciones necesarias.
jpbochi
8

Debería limitar la velocidad de sus reinicios en el ./finisharchivo para ese servicio, que se ejecuta con una terminación anormal. El ./finishscript recibirá el código de retorno desde ./runy desde allí, usted puede determinar qué hacer, etc. En ese caso, debe hacer que su ./finishscript grite en voz alta sobre los fallos y envíe notificaciones y salte a la llama ...

Avery Payne
fuente
Gracias, esta es la respuesta correcta, pero desafortunadamente los programadores modernos que usan python, ruby, etc. parecen escribir siempre aplicaciones que no prestan atención a las señales de Unix y no proporcionan códigos de salida adecuados.
figtrap
1
Supongo que los códigos de error devueltos aparentemente son "poco geniales".
Avery Payne
parece que. Creo que es un gran paso atrás, yo mismo.
figtrap
1

Realmente no soy un fanático de la gestión de procesos basada en init (y runit es básicamente un sustituto de init). Como está descubriendo, el reinicio simple de los procesos fallidos tan pronto como mueren no es una estrategia particularmente buena. He usado init para reiniciar monit, pero eso es todo lo posible. (potencialmente asesino OOM podría matar a monit).

Por lo tanto, te animo a buscar un reemplazo en lugar de arreglar las cosas.

Monit es bastante viejo, pero hace bien el trabajo, y no estoy al tanto de que haya aparecido algo mejor. Tiene la buena característica de no necesitar mallocar más memoria después del inicio, por lo que supera a todo lo que está escrito en un lenguaje de script. Lo último que desea es que su monitor de proceso muera porque no puede obtener memoria.

mc0e
fuente
systemd, incluido en EL7 y la mayoría de las otras distribuciones, puede manejar de forma nativa esta situación y una variedad de situaciones similares con una gran cantidad de opciones y en su mayoría hace que los administradores de procesos como estos sean obsoletos.
Michael Hampton
1
Hay un puñado de situaciones en las que systemd puede ser "demasiado grande" para el entorno de destino. Y el antiguo método de "gestión de procesos reiniciando hasta la ejecución" ha sido reemplazado en su mayoría por una resolución de dependencia adecuada. Consulte skarnet.org/software/s6-rc y jjacky.com/anopa para ver ejemplos.
Avery Payne