Zwei systemd-Services die sich gegenseitig ausschließen

Alle weiteren Dienste, die nicht in die drei oberen Foren gehören.
Antworten
scientific
Beiträge: 3022
Registriert: 03.11.2009 13:45:23
Lizenz eigener Beiträge: Artistic Lizenz
Kontaktdaten:

Zwei systemd-Services die sich gegenseitig ausschließen

Beitrag von scientific » 18.07.2015 23:09:41

Hi Leute!

Ich habe einerseits regelmäßige snapshots von meinem btrfs-Filesystem laufen und andererseits stellte ich fest, dass regelmäßig ein btrfs balance die Performance von btrfs hoch hält.

Aber ein btrfs-snapshot und auch ein btrfs-send/receive zu machen nimmt schon ganz schön Ressourcen in Anspruch, da noch ein balance draufzuschießen macht das System unbenützbar...

Ich habe die backups/snapshots mittels eines systemd-service/timers gestartet.
Und ich möchte nun das balance ebenfalls mittels einem systemd-service mittels timer regelmäßig starten.

Wie gestalte ich nun die service-units so, dass das balance nicht gestartet wird, wenn ein backup/snapshot läuft bzw. umgekehrt... Geht das überhaupt?

Ist "Conflicts=" die Option der Wahl?

lg scientific
dann putze ich hier mal nur...

Eine Auswahl meiner Skripte und systemd-units.
https://github.com/xundeenergie

auch als Debian-Repo für Testing einbindbar:
deb http://debian.xundeenergie.at/xundeenergie testing main

Benutzeravatar
catdog2
Beiträge: 5352
Registriert: 24.06.2006 16:50:03
Lizenz eigener Beiträge: MIT Lizenz

Re: Zwei systemd-Services die sich gegenseitig ausschließen

Beitrag von catdog2 » 18.07.2015 23:44:24

Ist "Conflicts=" die Option der Wahl?
Nein, das stoppt das jeweils andere.

Man könnte das mit einem "systemctl is-active …" in ExecStartPre machen.
Unix is user-friendly; it's just picky about who its friends are.

scientific
Beiträge: 3022
Registriert: 03.11.2009 13:45:23
Lizenz eigener Beiträge: Artistic Lizenz
Kontaktdaten:

Re: Zwei systemd-Services die sich gegenseitig ausschließen

Beitrag von scientific » 19.07.2015 00:24:06

Danke für den Hinweis! Das klingt vernünftig.

Dazu noch eine Frage. Ich habe eine Service-Unit namens
mkbackup@.service

und aktiviert habe ich sie mit
systemctl enable mkbackup@hourly.service
systemctl enable mkbackup@daily.service
systemctl enable mkbackup@weekly.service

Muss ich dann im Unit-File eine Abfrage mit systemctl is-active nach jedem einzelnen service machen?

Lg scientific
dann putze ich hier mal nur...

Eine Auswahl meiner Skripte und systemd-units.
https://github.com/xundeenergie

auch als Debian-Repo für Testing einbindbar:
deb http://debian.xundeenergie.at/xundeenergie testing main

scientific
Beiträge: 3022
Registriert: 03.11.2009 13:45:23
Lizenz eigener Beiträge: Artistic Lizenz
Kontaktdaten:

Re: Zwei systemd-Services die sich gegenseitig ausschließen

Beitrag von scientific » 27.07.2015 15:12:37

catdog2 hat geschrieben:
Ist "Conflicts=" die Option der Wahl?
Nein, das stoppt das jeweils andere.

Man könnte das mit einem "systemctl is-active …" in ExecStartPre machen.
So... wie kann ich das negierte Ergebnis abfragen?

Also, wenn ich die Abfrage mache

Code: Alles auswählen

ExecStartPre=/bin/systemctl is-active mkbackup.service
, wird der Service ja gestartet, wenn mkbackup.service läuft.
Aber ich will ja das Gegenteil davon erreichen... Der Service soll NICHT gestartet werden, wenn mkbackup.service läuft... aber ein systemctl is-not-active gibt es nicht... Das heißt, ich müsste irgendwie das Ergebnis negieren können in ExecStartPre...

Wie geht das?

lg scientific
dann putze ich hier mal nur...

Eine Auswahl meiner Skripte und systemd-units.
https://github.com/xundeenergie

auch als Debian-Repo für Testing einbindbar:
deb http://debian.xundeenergie.at/xundeenergie testing main

JTH
Moderator
Beiträge: 3083
Registriert: 13.08.2008 17:01:41
Wohnort: Berlin

Re: Zwei systemd-Services die sich gegenseitig ausschließen

Beitrag von JTH » 27.07.2015 15:51:00

Du könntest das Ergebnis „von Hand“ umdrehen:

Code: Alles auswählen

ExecStartPre=/bin/sh -c 'if /bin/systemctl --quiet is-active mkbackup; then /bin/false; else /bin/true; fi'
Manchmal bekannt als Just (another) Terminal Hacker.

Benutzeravatar
catdog2
Beiträge: 5352
Registriert: 24.06.2006 16:50:03
Lizenz eigener Beiträge: MIT Lizenz

Re: Zwei systemd-Services die sich gegenseitig ausschließen

Beitrag von catdog2 » 27.07.2015 18:26:57

Code: Alles auswählen

ExecStartPre=/bin/sh -c "!(/bin/systemctl is-active -q mkbackup.service)"
Unix is user-friendly; it's just picky about who its friends are.

scientific
Beiträge: 3022
Registriert: 03.11.2009 13:45:23
Lizenz eigener Beiträge: Artistic Lizenz
Kontaktdaten:

Re: Zwei systemd-Services die sich gegenseitig ausschließen

Beitrag von scientific » 30.07.2015 20:39:20

Das scheint einmal zu funktionieren.

Nächste Stufe :)

Ich habe eigentlich ein Service, welches mkbackup@.service heißt.
Dieses wird über Timer in verschiedenen Intervallen gestartet.
mkbackup@hourly.service
mkbackup@daily.service
...

Kann ich eine Abfrage in die Service-Unit einbauen, welche bewirkt, dass z.B. das daily-Backup NICHT gestartet wird, wenn gerade das weekly oder monthly läuft?

Da ja alle über die selbe systemd-unit gestartet werden, denke ich mir, könnte es schwierig werden. Aber hat vielleicht jemand eine Idee zu dieser Aufgabe?

lg scientific
dann putze ich hier mal nur...

Eine Auswahl meiner Skripte und systemd-units.
https://github.com/xundeenergie

auch als Debian-Repo für Testing einbindbar:
deb http://debian.xundeenergie.at/xundeenergie testing main

Benutzeravatar
catdog2
Beiträge: 5352
Registriert: 24.06.2006 16:50:03
Lizenz eigener Beiträge: MIT Lizenz

Re: Zwei systemd-Services die sich gegenseitig ausschließen

Beitrag von catdog2 » 30.07.2015 20:58:57

Man könnts so machen:

Code: Alles auswählen

ConditionPathExists=!/run/mybackup.lock
ExecStartPre=/bin/touch /run/mybackup.lock
ExecStopPost=/bin/rm /run/mybackup.lock
Unix is user-friendly; it's just picky about who its friends are.

scientific
Beiträge: 3022
Registriert: 03.11.2009 13:45:23
Lizenz eigener Beiträge: Artistic Lizenz
Kontaktdaten:

Re: Zwei systemd-Services die sich gegenseitig ausschließen

Beitrag von scientific » 31.07.2015 10:52:42

catdog2 hat geschrieben:Man könnts so machen:

Code: Alles auswählen

ConditionPathExists=!/run/mybackup.lock
ExecStartPre=/bin/touch /run/mybackup.lock
ExecStopPost=/bin/rm /run/mybackup.lock
Ah das klingt vernünftig!
dann putze ich hier mal nur...

Eine Auswahl meiner Skripte und systemd-units.
https://github.com/xundeenergie

auch als Debian-Repo für Testing einbindbar:
deb http://debian.xundeenergie.at/xundeenergie testing main

scientific
Beiträge: 3022
Registriert: 03.11.2009 13:45:23
Lizenz eigener Beiträge: Artistic Lizenz
Kontaktdaten:

Re: Zwei systemd-Services die sich gegenseitig ausschließen

Beitrag von scientific » 31.07.2015 15:24:08

Und jetzt bräuchte ich noch eine Anregung... Schätze aber einmal, dass sich das mit systemd nicht wirklich machen lässt...

Ich habe die regelmäßigen Backups, die ich mache, und die jetzt nicht mehr gleichzeitig ausgeführt werden.
Dann mache ich täglich ein btrfs-balance (der Erfolg gibt mir recht, das System ist jetzt weit weniger träge!), welches ich auch mit den oben genannten Mechanismen ausschließe, dass gleichzeitig mit dem Backup läuft.

In der [Unit]-Section gibt es ja den Parameter "After="...
Wenn jetzt gerade ein Backup läuft, und es sollte das Balancing gestartet werden, so wird das momentan unterbunden. Kann ich das irgendwie anschließend laufen lassen? Der After-Parameter ist ja hier nicht brauchbar. Denn wenn ich den einführen würde, würde ja diese Unit jedesmal danach ausgeführt werden. Oder?

lg scientific
dann putze ich hier mal nur...

Eine Auswahl meiner Skripte und systemd-units.
https://github.com/xundeenergie

auch als Debian-Repo für Testing einbindbar:
deb http://debian.xundeenergie.at/xundeenergie testing main

Antworten