Exécutez Script une fois par jour avec systemd

13

Je veux exécuter un script de sauvegarde 10 minutes après le démarrage de ma machine, mais seulement une fois par jour. Est-il possible de construire de tels scénarios avec systemd?

Fu86
la source
3
Je ne comprends pas parfaitement vos besoins, veuillez clarifier. Je comprends que si vous redémarrez votre machine plusieurs fois par jour, le script ne devrait s'exécuter qu'après le premier redémarrage, n'est-ce pas? Si votre machine fonctionne pendant plus d'un jour, le script doit-il être exécuté plusieurs jours consécutifs?
Krzysztof Adamski
Exactement. Je ferai une sauvegarde tous les jours, quelle que soit la fréquence de redémarrage de mon PC.
Fu86
5
Si vous n'êtes pas accroché à systemd, c'est exactement à cela que sert anacron.
Gilles 'SO- arrête d'être méchant'
Je peux me tromper, mais il n'y a pas de moyen facile de configurer anacron pour exécuter le script seulement 10 minutes après la fin du démarrage.
Krzysztof Adamski
C'est vrai. C'est pourquoi j'utilise actuellement l'anacron et le bon vieux, avec un travail quotidien commeecho "obnam backup" | at "now + 10 minutes"
Adrien Clerc

Réponses:

10

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

[Timer]
OnBootSec=15min
OnUnitActiveSec=1d

Cela exécute le .servicefichier correspondant 15 minutes après le démarrage, puis tous les jours pendant que le système est en marche. Si vous redémarrez plusieurs fois dans la même journée, vous pouvez simplement demander au script de sauvegarde de vérifier le temps de l'archive et d'ignorer cette exécution si elle date de moins d'un jour.

De plus, si vos sauvegardes vont être lourdes sur IO, il peut être utile de lire les directives IOScheduling * dans la page de manuel systemd.exec (5) .

Craig
la source
5

Je ne pense pas qu'il soit possible de le faire entièrement dans systemd car il ne suit aucun état entre les redémarrages. Vous pouvez facilement planifier l'exécution de quelque chose 10 minutes après le démarrage à l'aide de systemd.timeret de OnBootSec=ou OnStartupSec=.

Le script lui-même doit vérifier s'il a déjà été exécuté aujourd'hui ou non. Cela peut être facilement implémenté même en bash, par exemple:

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

[[ -z "$LASTRUN" ]] || [[ "$TODAY" -gt "$LASTRUN" ]] || exit
echo $TODAY > $FILE
RUNYOURSCRIPTHERE
Krzysztof Adamski
la source
1

Si vous n'êtes pas raccroché 10 minutes après le démarrage, vous pouvez:

[Unit]
Description=...

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target

OnCalendar=dailyle fait courir à minuit, Persisten=trueau démarrage s'il y avait au moins une course manquée.

x-yuri
la source
0

Apparemment, ce problème sera résolu dans les prochaines versions. Au moins selon cet e - mail sur la liste de diffusion systemd-devel. Jusque-là, vous devez suivre la voie hackeuse proposée par Krzysztof.

mmh
la source