Vor vielen Jahren konnten wir unser Startup-Skript schreiben /etc/rc.local
. Nachdem alle Systemdienste geladen wurden, wird Ihr Skript ausgeführt.
Jetzt benutzen wir systemd, das haben wir nicht rc.local
mehr. Systemd startet den Dienst parallel. Sie können Ihren eigenen Dienst schreiben, um einen rc.local-Befehl auszuführen, können jedoch nicht sicherstellen, dass er ausgeführt wird, nachdem alle Systemdienste geladen wurden.
Gibt es eine Möglichkeit, dies zu tun? Oder müssen wir Before
und After
in der systemd-Servicedatei verwenden?
Antworten:
In systemd ist es empfehlenswert , Ihre Dienste schön um die anderen zu nutzen
Before=
undAfter=
zu bestellen.Da Sie jedoch nach einem Weg gefragt haben, ohne
Before
und zu verwendenAfter
, können Sie Folgendes verwenden:was wie
man systemd.service
folgt erklärt:quelle
/proc/sys/kernel/modules_disabled
um1
am Ende des BootprozessesEs hängt wirklich von Ihrer Definition von "gebootet" ab. Ich nehme an, Sie möchten, dass es sofort nach dem Start von getty ausgeführt wird. Dazu müssen Sie Ihren Dienst zum
/etc/systemd/system/getty.target.wants/
Verzeichnis hinzufügen . Sie sollten auch sicherstellen, dass Ihre Datei ähnlichen Code wie die anderen Dienste in diesem Verzeichnis verwendet. Um einen benutzerdefinierten Dienst beim Booten und Herunterfahren auszuführen (piept einfach meinen Motherboard-Summer), verwende ich das folgende Skript in/etc/systemd/system/getty.target.wants/service_name.service
/usr/bin/myinitscript.sh
ist ausführbar und hat einen Shebang am Start.Beachten Sie, dass nicht alles an diesem Punkt des Startvorgangs gestartet wird, sondern an diesem Punkt die Anmeldeaufforderung für den Benutzer angezeigt wird
Obwohl dies
Before=
und verwendetAfter=
, war es für mich viel verständlicher und funktioniert tatsächlich; Ich fand die obige Antwort nicht informativ genug. Auf diese Weise können Sie auch beides verwendenExecStart=
undExecStop=
sind nicht auf einenType=simple
ähnlichen Dienst beschränkt.quelle
Ich kenne die Besonderheiten von ArchLinux nicht, aber hier erfahren Sie, wie man systemd im Allgemeinen verwaltet.
Nun, im Grunde ist systemd eine Sammlung von Skripten in /etc/init.d/, auf die durch Symlinks von /etc/rcX.d verwiesen wird, wobei X die Nummer der Ausführungsebene ist. Symlinks selbst haben das folgende Format:
woher:
Wenn Ihr Skript also als letztes in der Startsequenz ausgeführt werden soll, müssen Sie Folgendes tun:
runlevel
ls /etc/rc<target runlevel>.d/
und wählen Sie eine zweistellige Zahl, die größer ist als alle anderen, die sich bereits in diesem Runlevel befinden.update-rc.d
für Debian oderchkconfig
Fedora, oder manuell einen Symlink /etc/rc.d/S zu Ihrem Init-Skript.quelle