Nota: Escribí un artículo en Medium que explica cómo crear un servicio y cómo evitar este problema en particular: Crear un servicio de Linux con systemd .
Pregunta original
Estoy usando systemd para mantener un script de trabajo funcionando en todo momento:
[Unit]
Description=My worker
After=mysqld.service
[Service]
Type=simple
Restart=always
ExecStart=/path/to/script
[Install]
WantedBy=multi-user.target
Aunque el reinicio funciona bien si el script sale normalmente después de unos minutos, he notado que si falla repetidamente en el inicio, systemd
simplemente dejará de intentar iniciarlo:
Jun 14 11:10:31 localhost systemd[1]: test.service: Main process exited, code=exited, status=1/FAILURE
Jun 14 11:10:31 localhost systemd[1]: test.service: Unit entered failed state.
Jun 14 11:10:31 localhost systemd[1]: test.service: Failed with result 'exit-code'.
Jun 14 11:10:31 localhost systemd[1]: test.service: Service hold-off time over, scheduling restart.
Jun 14 11:10:31 localhost systemd[1]: test.service: Start request repeated too quickly.
Jun 14 11:10:31 localhost systemd[1]: Failed to start My worker.
Jun 14 11:10:31 localhost systemd[1]: test.service: Unit entered failed state.
Jun 14 11:10:31 localhost systemd[1]: test.service: Failed with result 'start-limit'.
Del mismo modo, si mi script de trabajo falla varias veces con un estado de salida de 255
, systemd
deja de intentar reiniciarlo:
Jun 14 11:25:51 localhost systemd[1]: test.service: Failed with result 'exit-code'.
Jun 14 11:25:51 localhost systemd[1]: test.service: Service hold-off time over, scheduling restart.
Jun 14 11:25:51 localhost systemd[1]: test.service: Start request repeated too quickly.
Jun 14 11:25:51 localhost systemd[1]: Failed to start My worker.
Jun 14 11:25:51 localhost systemd[1]: test.service: Unit entered failed state.
Jun 14 11:25:51 localhost systemd[1]: test.service: Failed with result 'start-limit'.
¿Hay alguna forma de forzar systemd
a volver a intentar siempre después de unos segundos?
StartLimitIntervalSec=0
y voilà.Sí lo hay Puede especificar volver a intentar después de
x
segundos en la[Service]
sección,Después de guardar el archivo, debe volver a cargar las configuraciones de daemon para asegurarse de
systemd
conocer el nuevo archivo,luego reinicie el servicio para habilitar los cambios,
Como ha solicitado, mirando la documentación,
Suena como una recomendación decente.
fuente
RestartSec
directiva,systemd
intenta varios reinicios muy rápidamente, luego entra en un estado de falla permanente; algo que no puede suceder cuandoRestartSec
se especifica?always
es un superconjunto deon-failure
, por lo que no ayudará.No. systemd deja de intentar reiniciarlo por un tiempo . Esto se muestra claramente en el registro que proporciona:
Esto es patada limitante de velocidad.
La duración del momento se especifica en la unidad de servicio, utilizando la
StartLimitIntervalSec=
configuración. El número de arranques que se necesitan dentro de ese intervalo para activar el mecanismo de limitación de velocidad se especifican a través de laStartLimitBurst=
configuración. Si nada en su sistema difiere de vanilla systemd, incluidos los valores predeterminados para estas dos configuraciones, entonces es 5 veces en 10 segundos.StartLimitIntervalSec=0
desactiva la limitación de velocidad, por lo que systemd volverá a intentarlo para siempre en lugar de darse por vencido. Pero hacer que su servicio no salga con tanta frecuencia o que esté lo suficientemente inactivo entre salidas y reinicios como para que no exceda el límite de límite de velocidad, es un mejor enfoque.Tenga en cuenta que a la limitación de velocidad no le importa cómo salió su servicio. Se dispara con la cantidad de intentos de iniciarlo / reiniciarlo, independientemente de su causa.
Otras lecturas
systemd.unit
. páginas de manual de systemd. freedesktop.org.fuente
StartLimitIntervalSec=10
yStartLimitIntervalSec=5
, sin suerte.StartLimitIntervalSec=0
.