Service Unit nur einmal ausführen (systemd)
Service Unit nur einmal ausführen (systemd)
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
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
-
- Beiträge: 3022
- Registriert: 03.11.2009 13:45:23
- Lizenz eigener Beiträge: Artistic Lizenz
-
Kontaktdaten:
Re: Service Unit nur einmal ausführen (systemd)
Prinzipiell überhaupt nur einmal, oder einmal nach dem Booten, oder einmal nach einem Update?
Definiere bitte "einmal" genauer.
Lg scientific
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
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
Re: Service Unit nur einmal ausführen (systemd)
Hej
wirklich nur ein Mal. Nur nach dem ersten Booten und dann nie wieder.
LG // neph
wirklich nur ein Mal. Nur nach dem ersten Booten und dann nie wieder.
LG // neph
Re: Service Unit nur einmal ausführen (systemd)
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.
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.
Re: Service Unit nur einmal ausführen (systemd)
KP97 hat geschrieben: [Service]
Type=oneshot
oneshot wird bei jedem Bootvorgang ausgeführt.nephilim hat geschrieben:wirklich nur ein Mal. Nur nach dem ersten Booten und dann nie wieder.
Für einmal und dann nie wieder, im Sinne von einmal nach der Installation des Systems ist systemd nicht gedacht.
-
- Beiträge: 3022
- Registriert: 03.11.2009 13:45:23
- Lizenz eigener Beiträge: Artistic Lizenz
-
Kontaktdaten:
Re: Service Unit nur einmal ausführen (systemd)
Nie wieder heißt "NIE wieder"? Dann braucht es - so wie KP97 schreibt auch keine Unit.nephilim hat geschrieben:Hej
wirklich nur ein Mal. Nur nach dem ersten Booten und dann nie wieder.
LG // neph
Nie wieder heißt "Bis zum Neustart nie mehr"? Dann kannst du einen Timer einrichten, der ein
Code: Alles auswählen
OnBootSec=
Nie wieder heißt "Nach jedem Starten von systemd einmal", dann kannst du einen Timer mit
Code: Alles auswählen
OnStartupSec=
Code: Alles auswählen
systemctl daemon-reexecute
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
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
Re: Service Unit nur einmal ausführen (systemd)
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.nephilim hat geschrieben: ich möchte eine Service-Unit nur einmal ausführen lassen und danach stoppen und deaktivieren.
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.
Re: Service Unit nur einmal ausführen (systemd)
Möglicherweise könnten dir die Condition* Optionen helfen:
https://www.freedesktop.org/software/sy ... hitecture=
https://www.freedesktop.org/software/sy ... hitecture=
Unix is user-friendly; it's just picky about who its friends are.