reinicio automático del servicio systemd después de StartLimitInterval

33

Quiero que mi servicio systemd se reinicie automáticamente en caso de falla. Además, quiero limitar la tasa de reinicios. Quiero permitir un máximo de 3 reinicios en 90 segundos de duración. Por lo tanto, he hecho la siguiente configuración.

[Servicio]
Reiniciar = siempre
StartLimitInterval = 90
StartLimitBurst = 3

Ahora el servicio se reinicia en caso de falla. Después de 3 fallos / reinicios rápidos, ya no se reinicia como se esperaba. Ahora esperaba que systemd iniciara el servicio después del tiempo de espera (StartLimitInterval). Pero el systemd no inicia automáticamente el servicio después del tiempo de espera (90 segundos), si reinicio manualmente el servicio después del tiempo de espera, está funcionando. Pero quiero que el systemd inicie automáticamente el servicio después del StartLimitInterval. Por favor, hágame saber cómo lograr esta función.

Dinesh PR
fuente
3
Escribí un artículo que explica cómo crear un servicio y cómo evitar este problema en particular: crear un servicio de Linux con systemd .
Benjamin
2
Creo que estás buscando StartLimitIntervalSec, no StartLimitInterval.
Marc Tamsky

Respuestas:

30

Para reiniciar el servicio 3 veces a intervalos de 90 segundos, incluya las siguientes líneas en su archivo de servicio systemd:

Restart=always
RestartSec=90
StartLimitInterval=400
StartLimitBurst=3

Esto funcionó para mí para un servicio que ejecuta un script usando 'Tipo = inactivo'. Tenga en cuenta que 'StartLimitInterval' debe ser mayor que 'RestartSec * StartLimitBurst'; de lo contrario, el servicio se reiniciará indefinidamente.

Me tomó un tiempo con mucha prueba y error descubrir cómo systemd usa estas opciones, lo que sugiere que systemd no está tan bien documentado como cabría esperar. Estas opciones proporcionan efectivamente el tiempo de ciclo de reintentos y los reintentos máximos que estaba buscando.

jross
fuente
Esto debe marcarse como respuesta aceptada ...
Jeff
no puedo encontrar la StartLimitInterval=directiva en mi último ubuntu 18 ...
mecha
10

El comportamiento que describe es coherente con la documentación:

StartLimitInterval =, StartLimitBurst = Configurar el límite de velocidad de inicio del servicio. Por defecto, los servicios que se inician más de 5 veces en 10 segundos no pueden iniciarse más veces hasta que finalice el intervalo de 10 segundos. Con estas dos opciones, esta limitación de velocidad puede modificarse. Use StartLimitInterval = para configurar el intervalo de verificación (el valor predeterminado es DefaultStartLimitInterval = en el archivo de configuración del administrador, establecido en 0 para deshabilitar cualquier tipo de limitación de velocidad). Use StartLimitBurst = para configurar cuántos inicios por intervalo están permitidos (el valor predeterminado es DefaultStartLimitBurst = en el archivo de configuración del administrador). Estas opciones de configuración son particularmente útiles junto con Restart =; sin embargo, se aplican a todo tipo de inicios (incluido el manual), no solo a los activados por la lógica Restart =.Tenga en cuenta que las unidades que están configuradas para Reiniciar = y que alcanzan el límite de inicio ya no se intentan reiniciar; sin embargo, aún pueden reiniciarse manualmente en un punto posterior, a partir de ese momento, la lógica de reinicio se activa nuevamente. Tenga en cuenta que systemctl reset-failure causará que se vacíe el contador de velocidad de reinicio de un servicio, lo cual es útil si el administrador desea iniciar un servicio manualmente y el límite de inicio interfiere con eso.

Todavía estoy tratando de encontrar la manera de lograr el comportamiento que deseas.

Youssef Eldakar
fuente
Esto es más un comentario que una respuesta como usted señala.
Dave M
exactamente lo que necesitaba, ty
Algunos Linux Nerd
Según la documentación que ha vinculado, ¿no debería ser StartLimitIntervalSec=(y DefaultStartLimitIntervalSec=)? Tenga en cuenta la adición de Seca ambos nombres de parámetros.
Doktor J
6

Algunos años después y con systemd 232 ya no funciona como se describe en la pregunta y en las respuestas de 2016. El nombre de la opción StartLimitIntervalSecy las secciones han cambiado. Ahora tiene que parecerse a este ejemplo:

[Unit]
StartLimitBurst=5
StartLimitIntervalSec=33

[Service]
Restart=always
RestartSec=5
ExecStart=/bin/sleep 6

Esto hará 5 reinicios en 30 segundos (5 * 6) más un reinicio en 33 segundos. Entonces tenemos 6 reinicios en 33 segundos. Esto excede el límite de 5 reinicios en 33 segundos. Entonces los reinicios se detendrán en 5 recuentos después de aproximadamente 31 segundos.

Ingo
fuente
1
Parece que StartLimitIntervaltodavía es compatible, si no está documentado, en la Servicesección. Pero el nuevo, preferido StartLimitIntervalSecsolo funciona en Unit.
Danek Duvall
1

Puede configurar OnFailurepara iniciar otro servicio cuando esto falla. En el servicio en caso de fallo , puede ejecutar un script que espera y luego reinicia su servicio.

Para ver una muestra de cómo configurar esto, consulte Correo de estado de Systemd en caso de falla de la unidad y modifíquelo para reiniciar el servicio.

laktak
fuente
1

Puedes usar StartLimitAction=reboot. Esto reiniciará el sistema después del StartLimitInterval.

StartLimitAction = Configure la acción a realizar si se alcanza el límite de velocidad configurado con StartLimitInterval = y StartLimitBurst =. Toma uno de ninguno, reiniciar, reiniciar-fuerza o reiniciar-inmediato. Si no se establece ninguno, alcanzar el límite de velocidad no activará ninguna acción además de que no se permitirá el inicio. reiniciar provoca un reinicio siguiendo el procedimiento de apagado normal (es decir, equivalente a reiniciar systemctl). reboot-force provoca un reinicio forzado que terminará todos los procesos por la fuerza pero no debería causar sistemas de archivos sucios en el reinicio (es decir, equivalente a systemctl reboot -f) y reiniciar inmediatamente provoca la ejecución inmediata de la llamada al sistema reiniciar (2), lo que podría resultar en pérdida de datos. Por defecto ninguno.

mcv
fuente