
Ich verwende einige Timereinheiten mit Vorlagen, um Sätze von Diensten mit Vorlagen auszuführen. Es gibt Sicherungsaufträge und zugehörige Wartungsaufgaben, die eine exklusive Sperre des Sicherungsrepositorys erfordern und nicht gleichzeitig mit den Sicherungsaufträgen ausgeführt werden können. Ich versuche herauszufinden, wie ich die Einheiten so einrichte, dass die Aufträge in der richtigen Reihenfolge ausgeführt werden.
Ich habe beispielsweise folgende Service-Vorlagen:
Ich habe folgende Timer-Vorlagen:
Wobei die [email protected]
Unit die entsprechende [email protected]
Instanz startet und das könnte etwa so aussehen:
[Unit]
Description=daily backup of %i
[Timer]
OnCalendar=daily
Unit=backup@%i.service
[Install]
WantedBy=timers.target
Wenn ich renne...
systemctl enable --now [email protected] [email protected]
...Ich muss sicherstellen, dass der Dienst clean@foo erst ausgeführt wird, nachdem der Dienst backup@foo abgeschlossen ist.
Die einzige Lösung, die mir bisher eingefallen ist, besteht darin, OnCalendar=daily
explizite Startzeiten zu entfernen und stattdessen zu verwenden, damit ich die Sicherungsaufträge garantieren kannStart(Starten Sie beispielsweise die Sicherungsjobs um 1 Uhr morgens und die Wartungsjobs um 2 Uhr morgens) und verwenden Sie dann eine Art Sperre (z. B. den flock
Befehl ), um sicherzustellen, dass die Wartungsjobs erst gestartet werden, wenn die Sicherungsjobs abgeschlossen sind.
Das funktioniert, ist aber ein bisschen umständlich. Wenn es eine bessere Möglichkeit gibt, das mit systemd zu lösen, würde ich das gerne herausfinden.
Antwort1
Nachdem man ein wenig über diese Frage nachgedacht hat, gibt es eine offensichtliche Antwort: [email protected]
Fügen Sie in der Vorlage eine Abhängigkeit von der entsprechenden [email protected]
Instanz hinzu, und zwar wie folgt:
[Unit]
After=backup@%i.service
Dies funktioniert einwandfrei, solange die Dienste parallel gestartet werden. Ich weiß derzeit nicht, ob Dienste mit derselben OnCalendar
Einstellung parallel gestartet werden oder nicht. Ich werde diese Antwort aktualisieren, sobald ich das herausgefunden habe.
Antwort2
Ich habe ein ähnliches Problem gelöst, indem ich einen auf den Job gesetzt habe Requires
. backup
Mein clean
Timer führt den clean
Job alle 6 Stunden aus – und aufgrund der Abhängigkeit clean
startet der Job den backup
, und wenn das Backup fertig ist, löscht er alle Snapshots, die älter als 60 Tage sind. Übrigens sind beide Dienste Type=oneshot
.
Ich habe auch überlegt, einen einzelnen Backup-and-Clean-Job durchzuführen, der auf ähnliche Weise funktioniert hätte.
Der Nachteil besteht darin, dass ich keinen Bereinigungsjob ausführen kann, ohne ein Backup zu starten. Dies stellt jedoch kein wirkliches Problem dar.