Es un hecho de la vida. Fallo de sistemas, software y servicios. Mantener contentos a los usuarios y mantener tranquilos a los buscapersonas es siempre una prioridad para todos los administradores de sistemas. Por lo tanto, saber cómo manejar las fallas 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 presentará varias formas en que systemd puede ayudarlo a mitigar las fallas del servicio.
Reiniciar la unidad fallida
Systemd hace que sea muy fácil reiniciar una celda en caso de falla. A veces, eso es todo lo que realmente necesitas. He trabajado con software defectuoso que ocasionalmente se encontraba con errores irrecuperables, fallaba y tenía que reiniciar. Idealmente, podrá solucionar posibles problemas de software, pero eso no siempre está bajo su control.
La siguiente unidad de servicio reiniciará el 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 Más opciones de reinicio.
Esta StartLimitBurst=2
y StartLimitIntervalSec=30
La configuración le dice a systemd que si el servicio falla dos intentos de reinicio dentro de los 30 segundos, debe entrar en un estado fallido y no volver a intentarlo. Esto asegura que si el servicio se corrompe, systemd no siga intentando reiniciarlo. Siempre debe ajustar esta configuración a valores que tengan sentido para su carga de trabajo.
Puede reiniciar el contador fallido con systemctl reset-failed
Pedido.
[ For more tips, see A beginner’s guide to network troubleshooting in Linux. ]
tomar medidas en caso de falla
Reiniciar un servicio es excelente, pero tomar medidas específicas en caso de que falle una unidad es aún mejor. Tal vez esté utilizando un software con un error conocido que requiere la eliminación de archivos de caché en caso de bloqueo, o tal vez desee iniciar un script que recopile registros e información del sistema para diagnosticar el problema. Systemd le permite especificar una unidad para ejecutar cuando falla un servicio.
Este ejemplo especifica OnFailure=my-app-recovery.service
decirle a systemd que si mi servicio falla, debería comenzar 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
Esta my-app-recovery
unit es solo una unidad de servicio de una sola vez que ejecuta este script:
[Unit]
Description=My App
[Service]
Type=oneshot
ExecStart=/usr/local/sbin/my-app-recovery.sh
El script puede hacer cualquier cosa: realizar alguna solución manual para que el servicio vuelva a funcionar, alertar a un sistema de monitoreo o comprimir algunos registros temporales y el estado de la aplicación para solucionar problemas. En este caso, simplemente escribe el mensaje en un archivo temporal y reinicia el servicio:
#!/bin/bash
echo 'Attempting to recover!' > /tmp/recovery_info
systemctl reset-failed my-app
systemctl restart my-app
Cuando la máquina entra en estado de falla, el registro de la máquina se mostrará claramente OnFailure
Dependencias activadas:
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.
Reinicie cuidadosamente el servicio OnFailure
texto. No desea un escenario en el que su secuencia de comandos sea tan buena para reiniciar servicios que nunca sepa que hay un problema. Sería prudente proporcionar algún tipo de entrada al sistema de alerta para que sepa cuándo se encuentra una condición de falla.
¿Has probado a apagarlo y encenderlo de nuevo?
Todos los administradores de sistemas conocen el valor de un buen reinicio para solucionar un problema extraño que quizás desee hacer en su OnFailure
texto. Afortunadamente, systemd incluye una funcionalidad integrada para activar un reinicio del sistema en caso de que falle la unidad. En este ejemplo, el sistema se reiniciará correctamente en caso de que falle el dispositivo:
[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. FailureAction
, por lo que debe Consulte la documentación de la unidad systemd Obtenga una descripción completa de sus capacidades.
[ Watch this free on-demand webinar: Preparing your IT infrastructure for the next 10 years. ]
Recuperación automática
Mantener los servicios funcionando sin problemas es el objetivo de cualquier administrador de sistemas dedicado, pero la automatización de escenarios de falla separa a los novatos de los veteranos experimentados. Systemd incluye potentes funciones para responder automáticamente y mantener los servicios en funcionamiento. En este artículo, aprendió sobre algunas características simples de systemd que lo ayudarán a mantener su sistema en buen estado de funcionamiento.