![Wie ist für die Anzeige von „Starten ... [ok]“ verantwortlich?](https://rvso.com/image/1562705/Wie%20ist%20f%C3%BCr%20die%20Anzeige%20von%20%E2%80%9EStarten%20...%20%5Bok%5D%E2%80%9C%20verantwortlich%3F.png)
Wenn ich einen Dienst starte wie:
root@foo [~]# service foobar stop
Stopping Foobar: [ OK ]
Ich sehe eine Statusanzeige: [ OK ]
die sich von der unterscheidet, die auf angezeigt wird /var/log/boot.log
:
[ OK ] Started LSB: disk temperature monitoring daemon.
...
Oder sogar anders als:
* /proc is already mounted
* Caching service dependencies ... [ ok ]
Welcher Prozess ist in diesen drei Beispielen für die Anzeige und den Start der Daemons verantwortlich? Anders gesagt, welche Bibliothek wird zur Anzeige von [ OK ]
, verwendet [FAILED]
?
Antwort1
Wenn ein manueller Aufruf service
eines SysV-Skripts aus /etc/init.d oder /etc/rc.d ausgeführt wird, hängt die gesamte Statusausgabe davon abvollständig auf diesem Skript.
Richtig geschriebene init.d-Skripte verwenden eine Bibliothek von Shell-Funktionen, die von der Distribution bereitgestellt werden. In Debian laden beispielsweise die meisten Skripte die Datei (Quelle) /lib/lsb/init-functions
und rufen einfach die bereitgestellten Funktionen wie folgt auf:
Fall "$1" in Start) log_daemon_msg"Starte $DESC" "$NAME" starte_starten Fall "$?" in 0|1)log_end_msg0 ;; 2) log_end_msg 1 ;; esac ;; [...] esac
Hier ist dieListe der Standardfunktionendefiniert durch LSB. (Beachten Sie, dass DistributionenzusätzlichFunktionen, die über den Standard hinausgehen, wie das obige Beispiel. Beachten Sie auch, dass z. B. OpenRC oder Arch Linuxsind nichtLSB-kompatibel und verwenden völlig unterschiedliche Stile.)
Tatsächlich stellen einige Distributionen diesen Boilerplate-Code auch zentral bereit, und das init.d-Skript muss nur noch implementieren do_start
. (Siehe Beispiele für OpenRC von Gentoo und Debian /lib/init/init-d-script
.) Dies ist jedoch keine „Standard“-LSB-Funktion – Skripte, die LSB-kompatibel sein sollen, müssen dies weiterhin manuell tun.
Notiz:Ich betone "Ordnungsgemäß geschrieben", weil es wirklich nichts gibt, wasGewaltein init.d-Skript, um diese Funktionen zu nutzen, ohne menschliche Überwachung. Wenn das Skript den Status über plain echo
(oder cowsay
auch via) melden möchte, kann es das immer tun. Dies ist insbesondere bei kommerzieller Software, die außerhalb der normalen Kanäle vertrieben wird, ein Problem: Ihre Statusausgabeniemalssieht ganz richtig aus (und ehrlich gesagt verhält sich das gesamte init.d-Skript nie ganz richtig).
Wenn während desBootvorgang, das Ergebnis ist sogar noch stärker von der Distribution abhängig – manchmal sehen Sie die Ausgabe direkt von den Skripten selbst, manchmal aber stellt das „Haupt“-Init-System seine eigene Statusausgabe für alle Dienste bereit, die es startet. (Beispiel:(Alte Initskripte von Arch Linux beim Starten eines Dienstes im Hintergrund.)
Aber Ihr zweites Beispiel ist eigentlichnichtein SysV-Stil-Init – es ist systemd (das in Ihrem Beispiel zufällig ein „altes“ init.d-Skript startet). Systemd ist ein vollständiger Service-Manager, der Service-Konfigurationen (keine Skripte) verwendet und daheralleDie Ausgabe des Boot-/Shutdown-Status wird von systemd selbst bereitgestellt. Dies gilt auch für die meisten anderen „Service Manager“, einschließlich init-ng, SMF oder Upstart.
Antwort2
Dies kommt von distributionsabhängigen Init-Skripten. Überprüfen Sie den Inhalt des service
Programms, dies ist wahrscheinlich ein Shell-Skript, das zugrunde liegende Verwaltungsskripte (SysV gelten mittlerweile als veraltet) oder Binärdateien (systemd ist die Lösung) aufruft. Dies ist einer der Vorteile von systemd – Sie erhalten keine „das kommt darauf an“-Antworten.