Ejecute el script cada 30 minutos con systemd

20

Me gustaría ejecutar un script cada 30 minutos después de iniciar el sistema. Sé que puedes usar cron, pero no planeo usar esta característica a menudo, por lo tanto, me gustaría probarlo con systemd.

Hasta ahora solo he encontrado los temporizadores monótonos que permiten ejecutar algo una vez (al menos eso creo). ¿Cómo sería el foo.timery [email protected]en caso de que quisiera ejecutar algo cada 30 minutos desde el arranque / inicio del sistema?

[email protected]

[Unit]
Description=run foo
Wants=foo.timer

[Service]
User=%I
Type=simple
ExecStart=/bin/bash /home/user/script.sh

foo.timer

[Unit]
Description=run foo

[Timer]
where I am stuck... ???
TomTom
fuente

Respuestas:

26

Necesita crear dos archivos: uno para servicio, otro para temporizador con el mismo nombre.

ejemplo:

/etc/systemd/system/test.service

[Unit]
Description=test job

[Service]
Type=oneshot
ExecStart=/bin/bash /tmp/1.sh

/etc/systemd/system/test.timer

[Unit]
Description=test

[Timer]
OnUnitActiveSec=10s
OnBootSec=10s

[Install]
WantedBy=timers.target

después de eso, vuelva a cargar el sistema usando el comando systemctl daemon-reloade inicie su temporizador systemctl start test.timero habilítelos de manera predeterminada.

contenido de prueba de 1.sh

#!/bin/bash
echo `date` >> /tmp/2

Y comando para verificar todos los temporizadores disponibles: systemctl list-timers --all

Información más detallada en la página del proyecto y ejemplos en la página de ArchLinux

Reishin
fuente
systemd acepta los scripts y está en la lista, sin embargo, no sucede nada
TomTom
¿cúal? Debe haber dos scripts, un temporizador y otro servicio. Tiempo, cuando fue ejecutado podría ser revisado por comando list-temporizadores, los errores posibles podrían ser revisados por systemctl status test.timery systemctl status test.servicecomamand
Reishin
1
utilice el systemctl list-timers --allcomando y verifique la salida. Él tiene que ser como este . Mire a la unidad, columnas izquierda y pasada. Si el temporizador está presente, consulte su archivo de servicio y verifique si hay errores allí, ya que el temporizador funciona normalmente.
Reishin
1
no, porque la pregunta principal no hace nada sobre "notificar-enviar" y creo que no debemos mezclar dos cosas diferentes cuando dicho tema ya está presente. en su caso, intente agregar export DISPLAY=:0.0al script.
Reishin
1
ps: según man systemd.timer, Persistent = true solo tiene un efecto en configurado con OnCalendar (es decir
wallclock
11

Aquí hay otra opción sin usar su temporizador. Si el tiempo no es terriblemente crítico y el script no se ejecuta durante mucho tiempo, estará bien para cosas simples.

[Unit]
Description=Run foo

[Service]
User=%I
Restart=always
RestartSec=1800s
ExecStart=/bin/bash /home/user/script.sh
Matt H
fuente
2
Me gusta esta solución El único inconveniente importante es que los registros del sistema se inundarán con registros de "Inicio <servicio X>" si reinicia con frecuencia (es decir, cada 30 segundos). En ese momento, podría ser mejor ejecutar el servicio como un demonio, en lugar de reiniciar el servicio una y otra vez desde systemd.
jersey bean
Es verdad. Para cosas rápidas y simples, funciona. Pero el temporizador o un script de larga ejecución sería una mejor solución.
Matt H