Configurar servicios de recuperación automática con systemd

Es un hecho de la vida. Los sistemas, el software y los servicios fallan. Mantener a los usuarios contentos y el buscapersonas en silencio siempre está en la mente de todos los administradores de sistemas. Por lo tanto, saber cómo manejar las interrupciones del servicio de manera rápida, eficiente e (idealmente) automática es el sello distintivo de un administrador de sistemas competente (y bien descansado). Este artículo le muestra algunas formas en que systemd puede ayudarlo a mitigar las fallas del servicio.

Índice

Reiniciar unidades fallidas

Systemd hace que sea muy fácil reiniciar una unidad en caso de falla. A veces eso es todo lo que realmente necesitas. He trabajado con software defectuoso que a veces encuentra un error fatal, falla y necesita reiniciarse. Idealmente, podría solucionar el problema de software subyacente, pero no siempre está bajo su control.

La siguiente unidad de servicio reiniciará un servicio si falla. Restart=on-failure cubre la gama más amplia de escenarios de falla, como señales sucias y códigos de salida sucios:

[Unit]
Description=My App
StartLimitIntervalSec=30
StartLimitBurst=2

[Service]
ExecStart=/usr/local/sbin/my-app.sh
Restart=on-failure

Cheque documentación del servicio systemd para más opciones de reinicio.

el StartLimitBurst=2 y StartLimitIntervalSec=30 La configuración le dice a systemd que si el servicio intenta reiniciarse dos veces en 30 segundos sin éxito, debe entrar en un estado fallido y no intentar reiniciarse nuevamente. Esto asegura que si el servicio está realmente dañado, systemd no intentará reiniciarlo de forma permanente. Siempre debe establecer estos parámetros en valores que tengan sentido para su carga de trabajo.

Puede reiniciar el contador fallido con el systemctl reset-failed pedido.

[ For more tips, see A beginner's guide to network troubleshooting in Linux. ]

Actuar en caso de falla

Reiniciar un servicio es bueno, pero tomar medidas específicas cuando falla una unidad es aún mejor. Tal vez esté utilizando un software con un error conocido que requiere eliminar un archivo de caché cuando falla, o tal vez quiera ejecutar un script que recopile registros e información del sistema para poder diagnosticar el problema. Systemd le permite especificar unidades que se ejecutan cuando falla un servicio.

Este ejemplo especifica OnFailure=my-app-recovery.service para decirle a systemd que si mi servicio falla, debe iniciar el my-app-recovery unidad:

[Unit]
Description=My App
StartLimitIntervalSec=30
StartLimitBurst=2
OnFailure=my-app-recovery.service

[Service]
ExecStart=/usr/local/sbin/my-app.sh
Restart=on-failure

el my-app-recovery unit es solo una unidad de servicio que ejecuta este script:

[Unit]
Description=My App

[Service]
Type=oneshot
ExecStart=/usr/local/sbin/my-app-recovery.sh

Este script puede hacerlo todo: realizar una solución manual para reiniciar el servicio, enviar una alerta a un sistema de monitoreo o comprimir registros temporales y el estado de la aplicación para solucionar problemas. En este caso, solo es cuestión de escribir un mensaje en un archivo temporal y reiniciar el servicio:

#!/bin/bash

echo 'Attempting to recover!' > /tmp/recovery_info
systemctl reset-failed my-app
systemctl restart my-app

Cuando esta unidad entra en un estado de falla, los registros de la unidad indicarán claramente que la OnFailure Se han desencadenado dependencias:

Aug 30 03:04:30 server01 systemd[1]: my-app.service: Main process exited, code=exited, status=1/FAILURE
Aug 30 03:04:30 server01 systemd[1]: my-app.service: Failed with result 'exit-code'.
Aug 30 03:04:30 server01 systemd[1]: my-app.service: Service RestartSec=100ms expired, scheduling restart.
Aug 30 03:04:30 server01 systemd[1]: my-app.service: Scheduled restart job, restart counter is at 1.
Aug 30 03:04:30 server01 systemd[1]: Stopped My App.
Aug 30 03:04:30 server01 systemd[1]: Started My App.
Aug 30 03:04:32 server01 systemd[1]: my-app.service: Main process exited, code=exited, status=1/FAILURE
Aug 30 03:04:32 server01 systemd[1]: my-app.service: Failed with result 'exit-code'.
Aug 30 03:04:32 server01 systemd[1]: my-app.service: Service RestartSec=100ms expired, scheduling restart.
Aug 30 03:04:32 server01 systemd[1]: my-app.service: Scheduled restart job, restart counter is at 2.
Aug 30 03:04:32 server01 systemd[1]: Stopped My App.
Aug 30 03:04:32 server01 systemd[1]: my-app.service: Start request repeated too quickly.
Aug 30 03:04:32 server01 systemd[1]: my-app.service: Failed with result 'exit-code'.
Aug 30 03:04:32 server01 systemd[1]: Failed to start My App.
Aug 30 03:04:32 server01 systemd[1]: my-app.service: Triggering OnFailure= dependencies.

Tenga cuidado al reiniciar los servicios en un OnFailure guión. No desea tener un escenario en el que su secuencia de comandos sea tan buena para reiniciar el servicio que nunca sepa que hay un problema. Es aconsejable proporcionar algún tipo de entrada en su sistema de alerta para que sepa cuándo encuentra una condición de falla.

¿Has probado a apagarlo y volverlo a encender?

Todos los administradores de sistemas conocen el valor de un buen reinicio para solucionar un problema extraño, y es posible que tenga la tentación de simplemente reiniciar su sistema. OnFailure guión. Afortunadamente, systemd incluye una función integrada para activar un reinicio del sistema en caso de que falle la unidad. En este ejemplo, el sistema se reiniciará normalmente si la unidad falla:

[Unit]
Description=My App
StartLimitIntervalSec=30
StartLimitBurst=2
FailureAction=reboot

[Service]
ExecStart=/usr/local/sbin/my-app.sh
Restart=on-failure

Hay varios valores válidos para FailureAction, así que asegúrese de consultar la documentación de la unidad systemd para una comprensión completa de sus capacidades.

[ Watch this free on-demand webinar: Preparing your IT infrastructure for the next 10 years. ]

recuperación automatizada

Mantener los servicios funcionando sin problemas es el objetivo de cualquier administrador de sistemas dedicado, pero la gestión automática de escenarios de falla diferencia a los nuevos empleados de los veteranos experimentados. Systemd incluye potentes funciones para automatizar sus respuestas y mantener los servicios en funcionamiento. En este artículo, aprendió sobre algunas características simples de systemd que lo ayudarán a mantener sus sistemas funcionando sin problemas.

Artículos de interés

Subir