Vi una solución aquí que parecía elegante, aunque un poco indirecta. La idea clave es crear un servicio único activado por un temporizador que reinicia otro Servicio.
Para el temporizador:
[Unit]
Description=Do something daily
[Timer]
OnCalendar=daily
Persistent=true
[Install]
WantedBy=timers.target
Para el servicio único:
[Unit]
Description=Restart service
[Service]
Type=oneshot
ExecStart=/usr/bin/systemctl try-restart my_program.service
Para el servicio one-shot en Ubuntu 16.04 LTS:
[Unit]
Description=Restart service
[Service]
Type=oneshot
ExecStart=/bin/systemctl try-restart my_program.service
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 una cierta cantidad de tiempo.
Para la versión systemd>=229, hay una opción llamada RuntimeMaxSec
, que finaliza el servicio después de que se haya estado ejecutando durante el período de tiempo determinado.
p.ej. Para reiniciar cada 7 días:
[Service]
Restart=always
RuntimeMaxSec=7d
A mí esto me parece más elegante que abusar de Type=notify
y WatchdogSec
.
systemd proporciona una forma limpia de agregar y anular directivas en los archivos de unidad systemd proporcionados por los proveedores. Las Unidades Drop-In se describen en man systemd.unit. Por ejemplo, si quisiera reiniciar periódicamente el servicio foo provisto por un paquete, crearía un archivo llamado /etc/systemd/system/foo.service.d/periodic-restart.conf
. El contenido sería como se muestra arriba. Entonces:
systemctl daemon-reload
systemctl restart foo
Puede confirmar que la unidad Drop-In se ha cargado porque se informará en la salida de estado:
systemctl status
Finalmente, puede confirmar que la directiva se ha incluido buscando en systemctl show
salida:
systemctl show foo.service | grep RuntimeMax
La directiva reportada por systemctl show
será "RuntimeMaxUSec`