Führen Sie Script einmal täglich mit systemd aus

13

Ich möchte ein Backup-Skript 10 Minuten nach dem Booten meines Rechners ausführen, aber nur einmal am Tag. Ist es möglich, solche Szenarien mit systemd aufzubauen?

Fu86
quelle
3
Ich verstehe Ihre Anforderungen nicht ganz, bitte klären Sie. Ich verstehe, dass das Skript nur nach dem ersten Neustart ausgeführt werden sollte, wenn Sie Ihren Computer mehrmals am Tag neu starten. Ist das richtig? Wenn Ihr Computer länger als einen Tag ausgeführt wird, sollte das Skript an aufeinander folgenden Tagen ausgeführt werden?
Krzysztof Adamski
Genau. Ich werde jeden Tag ein Backup erstellen, egal wie oft ich meinen PC neu starte.
Fu86
5
Wenn Sie nicht an systemd aufgehängt sind, ist dies genau das, wofür anacron gedacht ist.
Gilles 'SO- hör auf böse zu sein'
Ich kann mich irren, aber es gibt keine einfache Möglichkeit, anacron so einzustellen, dass es das Skript nur 10 Minuten nach Abschluss des Startvorgangs ausführt.
Krzysztof Adamski
Das ist richtig. Aus diesem Grund benutze ich derzeit Anacron und die guten Alten von, mit einem täglichen Job wieecho "obnam backup" | at "now + 10 minutes"
Adrien Clerc

Antworten:

10

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

[Timer]
OnBootSec=15min
OnUnitActiveSec=1d

Dadurch wird die entsprechende .serviceDatei 15 Minuten nach dem Start und dann jeden Tag ausgeführt, während das System in Betrieb ist. Wenn Sie mehrmals am selben Tag neu starten, können Sie das Sicherungsskript einfach die Uhrzeit des Archivs überprüfen lassen und die Ausführung überspringen, wenn es weniger als einen Tag alt ist.

Auch wenn Ihre Backups schwer mit E / A zu tun haben , kann es hilfreich sein, die IOScheduling * -Anweisungen in der Manpage systemd.exec (5) zu lesen .

Craig
quelle
5

Ich denke nicht, dass es möglich ist, dies vollständig in systemd zu tun, da es keinen Status zwischen Neustarts verfolgt. Sie können einfach planen, dass etwas 10 Minuten nach dem Booten ausgeführt wird, indem Sie systemd.timerund OnBootSec=oder verwenden OnStartupSec=.

Das Skript selbst muss prüfen, ob es heute bereits ausgeführt wurde oder nicht. Dies kann auch in bash problemlos implementiert werden, zum Beispiel:

#/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
quelle
1

Wenn Sie 10 Minuten nach dem Booten nicht aufgelegt haben, können Sie:

[Unit]
Description=...

[Timer]
OnCalendar=daily
Persistent=true

[Install]
WantedBy=timers.target

OnCalendar=dailyLässt es alle Mitternacht Persisten=truebeim Booten laufen, wenn mindestens ein Lauf verpasst wurde.

x-yuri
quelle
0

Anscheinend wird dieses Problem in zukünftigen Versionen behoben. Zumindest laut dieser E-Mail auf der systemd-devel Mailingliste. Bis dahin muss man den hackigen Weg gehen, den Krzysztof vorgeschlagen hat.

mmh
quelle