Backup mit rsync im Skript mit systemd

Du willst ein Backup mit rsync erstellen, damit mehrere verschiedene Verzeichnisse sichern und das ganze mittels systemd zeitgesteuert regelmäßig abfeuern… Dann hast du ein Problem.

Grundsätzlich könntest du natürlich jedes Verzeichnis in eine extra systemd-Unit packen und den rsync-Befehl als StartExec= aufrufen. Was aber, wenn zuvor das Zielverzeichnis konfiguriert, angelegt und geprüft werden soll? Was, wenn beim Backup auch git-Repos auf einen Server gepusht werden sollen (z.B. mit etckeeper)…

rsync verschwindet im Hintergrund und systemd denkt, das Skript ist nach einem Timeout fertig und beendet die backup-Unit. rsync wird abgebrochen.

Hier die Lösung. Sie ist zwar nicht schön, aber sie funktioniert. Getestet mit systemd 243 auf Fedora 31 und Version 241 auf Debian.

Das Skript beinhaltet mehrere rsync-Aufrufe, git commit und push Befehle und verschiedenes anderes für das Backup. Das ist hier nicht so wichtig. Es liegt unter /usr/local/bin/backup.sh

Die Systemd-Unit /etc/systemd/system/backup.service enthält


[Unit]
Description=Create Backup

[Service]
# must be Type=oneshot, so systemd waits to terminate unit until script has finished
Type=oneshot
RemainAfterExit=true
ExecStart=/usr/local/bin/backup.sh

Dann erstellt man sich am besten eine allgemein zu verwendende Service-Unit /etc/systemd/system/stop@.service mit dem Inhalt


[Unit]
Description=Stop %i, which ist RemainAfterExit=true
After=%i

[Service]
ExecStart=/bin/systemctl stop %i

[Install]
WantedBy=%i

Und der Timer /etc/systemd/system/backup.timer


[Unit]
Description=Timer for backup
Requires=mnt-backup.automount
After=mnt-backup.automount


[Timer]
OnCalendar=04:00:00
RandomizedDelaySec=7200
Persistent=true

[Install]
WantedBy=timers.target

Das Ganze wird dann enabled mit


sudo systemctl enable backup.timer stop@backup.service.service #das doppelte .service.service ist notwendig

Ob es funktioniert kann man manuell noch testen mit


sudo systemctl start backup.service

Erklärung:
Die backup.service Unit bleibt durch „RemainAfterExit=true“ nach dem Ende des Skriptes als „active“ gekennzeichnet. Systemd beendet die Unit nicht nach einem Timeout mit SIGTERM bzw. SIGKILL. Damit läuft das Backup trotz rsync im Skript auch durch. Aber diese Option verhindert, dass der Timer die backup.service-Unit erneut starten kann, da sie ja bis in alle Ewigkeit als Active gekennzeichnet bleibt.
Daher startet backup.service noch die stop@backup.service.service Unit. Das ist eine Instanziierende Unit, welche alles zwischen dem „@“ und „.service“ am Ende als Instanzenbezeichnung verwendet, die in der Unit dann mit %i als Variable verwendet werden kann.

Die Unit selbst hat für sich die Abhängigkeit drinnen, dass sie erst nach dem Beenden des Starts der aufrufenden Unit selbst gestartet wird. (also im Falle von Type=oneshot nach dem erfolgreichen Ende des gestarteten Skriptes). Die Stop-Unit macht nichts anderes als die sie aufrufende Unit zu stoppen.

Doppelseitiges PDF vertikal teilen

Unlängst habe ich einen spannenden Artikel auf einem meiner Lieblingsblogs (http://marathonfitness.de) als PDF gefunden. Ich war unterwegs und wollt mir den Artikel ausdrucken, um ihn im Bad lesen zu können. Jedoch ist das PDF im Querformat A3, wo zwei A4-Seiten im Hochformat nebeneinander sind.

Mein Drucker kann aber nur A4 ausdrucken, damit ist die Schrift viel zu klein, um sie noch ohne Anstrengung lesen zu können.

pdftk kann zwar ein mehrseitiges PDF in Einzelseiten auftrennen (je Seite eine Datei), aber nicht Doppelseiten „zerschneiden“. Dazu muss mupdf und die mupdf-tools her.

 


apt install mupdf-tools

Ein einseitiges aber auch ein mehrseitiges PDF wird dann Seite für Seite in zwei Seiten vertikal zerschnitten mit:

 


mutool poster -x 2 input.pdf output.pdf 

Die Option -x2 sagt aus, dass das Dokument in der X-Achse in zwei Teile geteilt werden soll. Die Schnittachse ist dementsprechend in der Mitte von oben nach unten, damit lins und rechts zwei gleich große Seiten entstehen.

Ein Dokument in einzelne Seiten aufsplitten macht man dann mit pdftk


pdftk input.pdf burst

Die Ausgabefiles findest du im selben Verzeichnis als pg_0001.pdf, pg_0002.pdf usw.

Willkommen im neuen Blog

Herzlich willkommen auf meinem neuen Blog!

Meine Absicht ist es, Wissenwertes und Erfahrungsberichte mit Linux, im speziellen Debian GNU/Linux festzuhalten. Immer wieder lerne ich neue Software kennen, weil ich ein spezielles Problemchen lösen muss und die Suche im Web oft mühsam ist. Die Ergebnisse aber umso besser.

Und dann geht die Zeit ins Land und der Mantel des Vergessens hüllt sich über das Gefundene…

Beim nächsten Mal geht die Suche von vorne los, aber dann gibt es die Seite von „damals“ nicht mehr, oder sie wurde verändert, oder die selber angepasste Lösung war sowieso nirgendwo zu finden. Damit wurde mir im Laufe der Zeit bewusst, dass es notwendig ist, mein gesammeltes Wissen an leicht zugänglicher Stelle aufzubewahren.

Ich hoffe auch für Euch finden sich hier einige nützliche Ergebnisse.

Euer Jakob