Service Unit nur einmal ausführen (systemd)

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
nephilim
Beiträge: 39
Registriert: 06.03.2017 18:11:50

Service Unit nur einmal ausführen (systemd)

Beitrag von nephilim » 14.03.2017 09:01:10

Hej zusammen,

ich möchte eine Service-Unit nur einmal ausführen lassen und danach stoppen und deaktivieren.

Ich habe mir jetzt folgendermaßen geholfen: Ich lasse in der betroffenen Unit am Ende noch ein Script starten, welches mit einer Verzögerung von 90 Sekunden die systemctl-Befehle dafür ausführt. Meine Frage ist: läßt sich das vielleicht in der Definition der Service-Unit selbst eleganter lösen? Ich suche mir einen Wolf, aber finde bisher dazu nichts gescheites. Gut möglich dass ich falsch suche. Hilfe ist sehr willkommen.

Danke im Voraus.

LG // neph

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

Re: Service Unit nur einmal ausführen (systemd)

Beitrag von scientific » 14.03.2017 09:45:17

Prinzipiell überhaupt nur einmal, oder einmal nach dem Booten, oder einmal nach einem Update?

Definiere bitte "einmal" genauer.

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

nephilim
Beiträge: 39
Registriert: 06.03.2017 18:11:50

Re: Service Unit nur einmal ausführen (systemd)

Beitrag von nephilim » 14.03.2017 14:35:29

Hej

wirklich nur ein Mal. Nur nach dem ersten Booten und dann nie wieder.

LG // neph

KP97
Beiträge: 3403
Registriert: 01.02.2013 15:07:36

Re: Service Unit nur einmal ausführen (systemd)

Beitrag von KP97 » 14.03.2017 15:38:48

Das ist immer noch ungenau.
Nur einmal nach dem Booten, und dann erst wieder nur einmal nach dem nächsten Booten (Neustart oder Reboot?), oder wirklich nur ein einziges Mal, dann bräuchte es allerdings keinen Service.
Beschäftige Dich mit dem Suchbegriff
[Service]
Type=oneshot
In den Manpages wird das erklärt, und wenn ich mich recht entsinne, hat auch TomL mal was dazu geschrieben.

Benutzeravatar
MSfree
Beiträge: 10684
Registriert: 25.09.2007 19:59:30

Re: Service Unit nur einmal ausführen (systemd)

Beitrag von MSfree » 14.03.2017 15:43:26

KP97 hat geschrieben: [Service]
Type=oneshot
nephilim hat geschrieben:wirklich nur ein Mal. Nur nach dem ersten Booten und dann nie wieder.
oneshot wird bei jedem Bootvorgang ausgeführt.

Für einmal und dann nie wieder, im Sinne von einmal nach der Installation des Systems ist systemd nicht gedacht.

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

Re: Service Unit nur einmal ausführen (systemd)

Beitrag von scientific » 14.03.2017 15:47:28

nephilim hat geschrieben:Hej

wirklich nur ein Mal. Nur nach dem ersten Booten und dann nie wieder.

LG // neph
Nie wieder heißt "NIE wieder"? Dann braucht es - so wie KP97 schreibt auch keine Unit.
Nie wieder heißt "Bis zum Neustart nie mehr"? Dann kannst du einen Timer einrichten, der ein

Code: Alles auswählen

OnBootSec=
hat, wo du eine Zeitspanne definierst, wie lange nach dem Booten du warten möchtest, bis der Service gestartet wird.
Nie wieder heißt "Nach jedem Starten von systemd einmal", dann kannst du einen Timer mit

Code: Alles auswählen

OnStartupSec=
einrichten. Im Regelfall wird Systemd nur nach dem Boot gestartet. Der aufgerufene Service würde aber auch bei einem

Code: Alles auswählen

systemctl daemon-reexecute
aufgerufen werden (Wenn ich das korrekt verstanden habe).
Nie wieder heißt "Ein Paket wird installiert, dann soll einmal ein Programm gestartet werden. Und zwar bei jeder Neuinstallation des Paketes", dann musst du den Aufruf in dein Paket verpacken, so du eines geschnürt hast.

Eventuell ist das Stichwort "ConditionNeedsUpdate=" aus man systemd.unit das was du benötigst.

Du siehst, ein einfaches "einmal" kann sehr Unterschiedliches bedeuten. Und "nie wieder" ist bei weitem nicht so eindeutig, wie es vermuten lässt.

Bitte mehr Informationen.

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

TomL

Re: Service Unit nur einmal ausführen (systemd)

Beitrag von TomL » 14.03.2017 18:52:15

nephilim hat geschrieben: ich möchte eine Service-Unit nur einmal ausführen lassen und danach stoppen und deaktivieren.
Wenn "nur einmal" wörtlich zu nehmen ist, dann brauchst Du kein Systemd und keine Service-Unit. Starte einfach den Befehl aus dem "ExecStart"-Statement von Hand im Terminal und gut is.Wenn das jedoch nicht funktioniert oder es unbedingt "nur einmal" via service-unit sein soll, dann startet man es halt nur einmal manuell via "systemctl start" und beendet es nach Wunsch mit "systemctl stop". Danach wird es nie wieder gestartet.... weil Du ja nicht via "systemctl enable" den automatischen Start beim Booten eingestellt hast.

Die Forderung "nur einmal" im Zusammenhang mit systemd ist allerdings schon einigermaßen merkwürdig.... weil systemd ja primär ein Service-Starter und -Manager ist, der Services und Jobs koordiniert beim Systemstart starten soll und im weiteren Rechnerbetrieb deren Wirken beobachtet. Die eigentliche Aufgabe von systemd ist ja gerade der geordnete bei jedem Boot wiederholte Start von Services und Jobs. "Nur einmal" macht man eben dann "nur einmal " von Hand im Terminal.

Vielleicht ist aber auch nur die Formulierung etwas unpassend gewählt. Systemd kann
- einen Job starten und beobachten
- einen Job starten und ihn als aktiv "betrachten", obwohl er beendet wurde
- einen Job starten, beobachten und zur Beendigung auffordern (oder ggf. beenden, wenn er die Aufforderung ignoriert)

Das heisst, die Verantwortung, wann und wie der Job beendet wird liegt eigentlich beim Job, wenn er außerplanmäßig (aus Sicht systemd) vorzeitig beendet werden soll. Oder alternativ bei dem, der mit root-Rechten autorisiert ist, außerplanmäßig Jobs zu beenden. Ein Job muss auf jeden Fall nicht "durchlaufen", bis der Rechner runtergefahren wird. Ein Job kann sich jederzeit selber beenden, wenn er der Meinung ist, seine Aufgabe erfüllt zu haben. Mit systemd hast Du nur zusätzlich die Möglichkeit, diesen Job weiterhin als aktiv zu betrachten, um ihn trotzdem in die Job-Stop-Kette einzureihen, wenn das System runtergefahren wird.

Du müsstest, wie schon vorher gesagt, genauer beschreiben, was Du überhaupt willst und in welchem Zusammenhang man "nur einmal" verstehen soll.

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

Re: Service Unit nur einmal ausführen (systemd)

Beitrag von catdog2 » 15.03.2017 00:59:57

Möglicherweise könnten dir die Condition* Optionen helfen:

https://www.freedesktop.org/software/sy ... hitecture=
Unix is user-friendly; it's just picky about who its friends are.

Antworten