Ejecute Script una vez al día con systemd


13

Quiero ejecutar un script de respaldo 10 minutos después de iniciar mi máquina, pero solo una vez al día. ¿Es posible construir tales escenarios con systemd?


3
No entiendo completamente sus requisitos, por favor aclare. Entiendo que si reinicia su máquina varias veces en un día, el script solo debe ejecutarse después del primer reinicio, ¿es así? Si su máquina funciona durante más de 1 día, ¿el script debe ejecutarse en días consecutivos?
Krzysztof Adamski

Exactamente. Haré una copia de seguridad todos los días sin importar la frecuencia con que reinicie mi PC.
Fu86

55
Si no está colgado en systemd, esto es exactamente para lo que sirve anacron.
Gilles 'SO- deja de ser malvado'

Puedo estar equivocado, pero no hay una manera fácil de configurar anacron para que ejecute el script solo 10 minutos después de que se complete el arranque.
Krzysztof Adamski

Así es. Es por eso que actualmente estoy usando anacron y los buenos en, con un trabajo diario comoecho "obnam backup" | at "now + 10 minutes"
Adrien Clerc

Respuestas:


10

Ver /lib/systemd/system/systemd-tmpfiles-clean.timer:

[Timer]
OnBootSec=15min
OnUnitActiveSec=1d

Esto ejecuta el .servicearchivo correspondiente 15 minutos después del arranque y luego todos los días mientras el sistema está activo. Si reinicia varias veces en el mismo día, puede hacer que el script de copia de seguridad verifique el tiempo del archivo y omita esa ejecución si tiene menos de un día de antigüedad.

Además, si sus copias de seguridad serán pesadas para IO, puede ser útil leer sobre las directivas IOScheduling * en la página de manual systemd.exec (5) .


5

No creo que sea posible hacer esto completamente en systemd, ya que no rastrea ningún estado entre reinicios. Puede programar fácilmente algo para que se ejecute 10 minutos después del inicio usando systemd.timery su OnBootSec=o OnStartupSec=.

El script en sí tiene que verificar si ya se ejecutó hoy o no. Esto se puede implementar fácilmente incluso en bash, por ejemplo:

#/bin/sh -x
FILE=/etc/lastrun
TODAY=`date +"%Y%m%d"`
LASTRUN=`cat $FILE`

[[ -z "$LASTRUN" ]] || [[ "$TODAY" -gt "$LASTRUN" ]] || exit
echo $TODAY > $FILE
RUNYOURSCRIPTHERE

1

Si no está colgado 10 minutos después del arranque, puede:

[Unit]
Description=...

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target

OnCalendar=dailyhace que se ejecute cada medianoche, Persisten=trueen el arranque si hubo al menos una carrera perdida.


0

Aparentemente, este problema se abordará en futuras versiones. Al menos según este correo electrónico en la lista de correo systemd-devel. Hasta que tengas que seguir el rudo camino que Krzysztof propuso.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.