systemd ExecStop btrfs scrub

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:

systemd ExecStop btrfs scrub

Beitrag von scientific » 21.10.2015 21:48:26

Wie mache ich das richtig?

Ich möchte mit einer Unit btrfs-scrub starten und auch möglicherweise vorzeitig stoppen.
Die zugehörigen Befehle lauten

Code: Alles auswählen

/bin/btrfs scrub start -Bd <Mountpoint>
Damit scrub im Vordergrund läuft.

Wenn ich das als ExecStart einfüge, läuft scrub auch bis zum Ende durch.
Ein

Code: Alles auswählen

systemctl stop btrfs-scrub.service
jedoch hängt fest und wartet auf ein timeout.

btrfs scrub muss man auch mit cancel unterbrechen.

Also ein

Code: Alles auswählen

ExecStop=/bin/btrfs scrub cancel <Mountpoint>
eingefügt und die Unit lässt sich per systemctl vorzeitig beenden.
Aber läuft das service bis zum Ende durch, fällt die Unit in den Failed-Zustand, da ExecStop= aufgerufen wird, aber btrfs scrub ja schon beendet ist.

Muss ich eine eigene Unit zum stoppen von btrfs scrub einrichten (wie ich im Archlinus-Forum fand), oder gibt es eine Option in einer Service-Unit, wie man ExecStop beim Beenden ohne einem Fehler von ExecStart überspringen kann? Ich finds in der Doku nicht.

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
smutbert
Beiträge: 8350
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: systemd ExecStop btrfs scrub

Beitrag von smutbert » 21.10.2015 21:57:42

Ich würde als StopExec einfach ein Skript ausführen, das herausfindet ob ein scrub im Gange ist und wenn ja, den stoppt. Wie du das mit einer eigenen unit machen willst verstehe ich nicht.

(oder kommt der FailedStatus immer wenn etwas beendet ist, was ein StopExec hat? Aber das gibts ja auch nicht, sonst könnte man StopExec ja nicht dazu mißbrauchen Dinge beim Herunterfahren zu erledigen und bei StartExec=/bin/true einzutragen?)

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

Re: systemd ExecStop btrfs scrub

Beitrag von scientific » 21.10.2015 22:19:19

smutbert hat geschrieben:Ich würde als StopExec einfach ein Skript ausführen, das herausfindet ob ein scrub im Gange ist und wenn ja, den stoppt. Wie du das mit einer eigenen unit machen willst verstehe ich nicht.

(oder kommt der FailedStatus immer wenn etwas beendet ist, was ein StopExec hat? Aber das gibts ja auch nicht, sonst könnte man StopExec ja nicht dazu mißbrauchen Dinge beim Herunterfahren zu erledigen und bei StartExec=/bin/true einzutragen?)
Die Unit zum stoppen sähe so aus:

Code: Alles auswählen

$ cat btrfs-scrub-stop
[Unit]
Description=Stop btrfs-scrub

[Service]
ExecStart=/bin/btrfs scrub cancel /
Das heißt ich würde einen btrfs-scrub-Lauf durch das Starten dieser Unit stoppen. Anscheinend verhindert ein aktiver Scrub-Lauf das Suspend, deswegen wird im Archlinux-Forum diese Lösung vorgeschlagen...

Der Failed-Status kommt übrigens nur dann, wenn ExecStop fehlschlägt. Im konkreten Falle wird btrfs scrub cancel auf einem Subvolume ausgeführt, wo kein Scrub läuft... weil es ja bereits beendet ist.
Aber btrfs scrub lässt sich offenbar nicht durch ein SIGTERM (ist das das Signal, welches systemd an seine überwachten Services schickt?) ordentlich beenden, wenn es im Vordergrund läuft...

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: systemd ExecStop btrfs scrub

Beitrag von JTH » 21.10.2015 23:22:36

Geht es dir nur um den Status des Services oder hängt der Service dann tatsächlich beim Ausführen von ExecStop?

Wenn es nur um den Status geht:

Dem Kommando in der ExecStart-Zeile kann man ein - voranstellen, dann wird der Exitcode ignoriert (Ein Wert ungleich null bringt den Service dann nicht zum Scheitern). Evtl. kann man das auch bei den ExecStop-Zeilen? Die manpage erwähnt das leider nur bei ExecStart/-Pre/-Post.

Alternativ kannst du im ExecStop ja auch einen positiven Exitcode "erzwingen":

Code: Alles auswählen

ExecStop=/bin/sh -c '/bin/btrfs scrub cancel /; /bin/true'
Manchmal bekannt als Just (another) Terminal Hacker.

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

Re: systemd ExecStop btrfs scrub

Beitrag von scientific » 21.10.2015 23:59:16

Btrfs scrub muss mit cancel beendet werden, da sonst ein Zombie entsteht.

Hab ich die Zeile

Code: Alles auswählen

ExecStop=btrfs scrub cancel
in der Unit, schlägt die Unit beim regulären Durchlauf fehl. Da ich unter anderem bei diesem Service gern ein Mail hätte, solle er fehlschlagen, bekomme ich so bei jedem Durchlauf ein Fehlermail (OnFailure=...)

Hab ich die Zeile nicht in der Unit, läuft der Service glatt durch und ein Fehlermail kommt nur, wenn btrfs scrub tatsächlich einen Fehler produziert.
Möchte ich den Service manuell stoppen (systemctl stop btrfs-scrub.service) bleibt der Stop-Befehl hängen und läuft in ein Timeout, da btrfs scrub mit einem SIGTERM und SIGKILL versucht wird zu beenden... und es bleibt wieder ein Zombie zurück. Das bedeutet auch, dass ein Shutdown des Systems unnötig verzögert wird...

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: systemd ExecStop btrfs scrub

Beitrag von scientific » 22.10.2015 11:17:38

So. Hab jetzt einen neuen ExecStop-Befehl gebaut.

Code: Alles auswählen

ExecStop=/bin/sh -c '/bin/ps  h -o command -p $MAINPID  && /bin/btrfs scrub cancel %f
Jetzt kann ich scrubbing auch mit der selben Unit stoppen wie starten. NUR liefert btrfs scrub, wenn es mit cancel beendet wird einen Exit-Code 1...
Das heißt, der Befehl mit

Code: Alles auswählen

ExitStart=/bin/btrfs scrub start -Bd %f[/quote] schlägt dann sozusagen fehl und die Unit fällt wieder in den Failure-Zustand... Auch nicht das, was ich wollte...

Kann das hier jemand nachvollziehen?

Hier findet ihr meine units: [url]https://github.com/xundeenergie/mkbtrbackup/tree/master/systemd-units[/url]

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
smutbert
Beiträge: 8350
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: systemd ExecStop btrfs scrub

Beitrag von smutbert » 22.10.2015 14:17:15

Ja, das ist so, das hätte ich aber auch fast erwartet (ich meine wenn ich vorher genug nachgedacht hätte, um überhaupt etwas bestimmtes zu erwarten ☺).

Ich würde ja für das Starten des Scrubs eine Art Wrapperskript bauen, dass überprüft ob der scrub fertig oder abgebrochen wurde — im einfachsten Fall genügt dafür ein grep canceled der Ausgabe — und im Falle eines Abbruchs das Skript einfach mit exit 0 beenden, aber ich nehme an darauf wärst du auch ohne meine Hilfe gekommen...

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

Re: systemd ExecStop btrfs scrub

Beitrag von scientific » 22.10.2015 20:23:28

smutbert hat geschrieben:Ja, das ist so, das hätte ich aber auch fast erwartet (ich meine wenn ich vorher genug nachgedacht hätte, um überhaupt etwas bestimmtes zu erwarten ☺).

Ich würde ja für das Starten des Scrubs eine Art Wrapperskript bauen, dass überprüft ob der scrub fertig oder abgebrochen wurde — im einfachsten Fall genügt dafür ein grep canceled der Ausgabe — und im Falle eines Abbruchs das Skript einfach mit exit 0 beenden, aber ich nehme an darauf wärst du auch ohne meine Hilfe gekommen...
Hab meine Unit noch mit einem Wrapper-Skript aufgepeppt. Scheint gut zu funktionieren.

Die aktuellen Units findest du (übrigens auch mit den anderen für mein btrfs-backup-skript) in meinem neuen git-Repository.
Ich glaub es ist günstiger diese dort zu posten. Den Link findest du im letzten Posting von mir.

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
smutbert
Beiträge: 8350
Registriert: 24.07.2011 13:27:39
Wohnort: Graz

Re: systemd ExecStop btrfs scrub

Beitrag von smutbert » 22.10.2015 21:59:29

Danke, habe ich gesehen.

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: systemd ExecStop btrfs scrub

Beitrag von rendegast » 22.10.2015 22:17:26

In units auf Wrapperskripte zurückzugreifen ist ein Abfall vom wahren systemd-Glauben.
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")

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

Re: systemd ExecStop btrfs scrub

Beitrag von scientific » 22.10.2015 22:19:21

rendegast hat geschrieben:In units auf Wrapperskripte zurückzugreifen ist ein Abfall vom wahren systemd-Glauben.
Zum Glück gehts nicht um ein Glaubenssystem, sondern um Lösungen die funktionieren. :)
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