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.
StartLimitIntervalSec
, noStartLimitInterval
.Respuestas:
Para reiniciar el servicio 3 veces a intervalos de 90 segundos, incluya las siguientes líneas en su archivo de servicio systemd:
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.
fuente
StartLimitInterval=
directiva en mi último ubuntu 18 ...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.
fuente
StartLimitIntervalSec=
(yDefaultStartLimitIntervalSec=
)? Tenga en cuenta la adición deSec
a ambos nombres de parámetros.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
StartLimitIntervalSec
y las secciones han cambiado. Ahora tiene que parecerse a este ejemplo: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.
fuente
StartLimitInterval
todavía es compatible, si no está documentado, en laService
sección. Pero el nuevo, preferidoStartLimitIntervalSec
solo funciona enUnit
.Puede configurar
OnFailure
para 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.
fuente
Puedes usar
StartLimitAction=reboot
. Esto reiniciará el sistema después del StartLimitInterval.fuente