linux - servicios - systemctl ubuntu
¿Cómo puedo configurar un servicio systemd para reiniciar periódicamente? (5)
¿Qué tal un crontab como
30 3 * * sun /bin/systemctl restart yourService
que reiniciaría el servicio a su servicio a las 3:30 am cada domingo.
Tengo un servicio systemd simple que necesita ser reiniciado periódicamente para evitar que su proceso se salga. ¿Hay alguna opción de configuración para que los servicios de systemd los reinicien periódicamente? Todas las opciones de Restart*
parecen pertenecer al reinicio del servicio cuando se cierra.
Es posible que esto no haya estado presente en el momento en que se hizo la pregunta, pero ahora existe una opción llamada RuntimeMaxSec
, que termina el servicio después de que se haya estado ejecutando durante el período de tiempo dado.
p.ej
[Unit]
Description=Do something daily
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timer.target
Para mí, esto parece más elegante que abusar de Type=notify
y WatchdogSec
.
Sí, puede hacer que su servicio se reinicie periódicamente haciendo que su servicio sea Type=notify
. Agregue esta opción en la sección [Servicio] de su archivo de servicio junto con Restart=always
y proporcione WatchdogSec=xx
, donde xx es el período de tiempo en segundo que desea reiniciar su servicio. Aquí su proceso será cancelado por systemd después del período de tiempo xx y será reiniciado por systemd nuevamente. por ej.
[Unit]
.
.
[Service]
Type=notify
.
.
WatchdogSec=10
Restart=always
.
.
[Install]
WantedBy= ....
Solo algunos enfoques alternativos para finalmente alcanzar el mismo objetivo:
- Si tiene control sobre la implementación del servicio, puede hacer que finalice voluntariamente después de un tiempo, por ejemplo, ya sea saliendo de forma simple después de un cierto número de iteraciones (si corresponde) o utilizando un temporizador de tiempo de espera con un manejador que se envía a sí mismo como SIGTERM / SIGKILL
- Si la finalización voluntaria del servicio no es factible / práctica, podría tener un pequeño script basado en cron que elimine los procesos de servicio.
Vi una solución here que parecía elegante, aunque un poco redonda. La idea clave es crear un servicio de un disparo disparado por un temporizador que reinicie otro servicio.
Para el temporizador:
[Unit]
Description=Restart service
[Service]
Type=oneshot
ExecStart=/usr/bin/systemctl try-restart my_program.service
Para el servicio de un disparo:
[Unit]
Description=Restart service
[Service]
Type=oneshot
ExecStart=/bin/systemctl try-restart my_program.service
Para el servicio one-shot en Ubuntu 16.04 LTS:
[Service]
Restart=always
RuntimeMaxSec=604800
Esta solución le permite aprovechar los temporizadores de systemd, incluida la capacidad de reiniciar el servicio en un momento determinado del día, y no solo después de que haya transcurrido cierto tiempo.