Unterschied zwischen systemctl init.d und service

39

Ich bin neu in Linux und habe mich mit einer Amazon Lightsail-Instanz (Ubuntu 16.04 LTS) getestet.

Bei der Durchsicht der vielen Anleitungen, auf die ich gestoßen bin, sehe ich Leute, die verschiedene Befehle verwenden, um einen Dienst zu starten / anzuhalten / neu zu starten / neu zu laden / den Status zu überprüfen. Speziell diese;

sudo systemctl status apache2.service
sudo /bin/systemctl status apache2.service
sudo /etc/init.d/apache2 status
sudo service apache2 status

Alle oben genannten Befehle funktionieren.

  1. Sollte ich einen Befehl dem anderen vorziehen?
  2. Wenn ja, warum dann?
  3. Gibt es noch andere Befehle, die ich beachten muss?

Die Verwendung von init.d in Monit verursachte Probleme, als ich die Statusoption verwenden wollte (Status ist, dass der Dienst offline ist, als er tatsächlich online war - von Monit neu gestartet). Ändern Sie den Code in Monit von inid.d in / bin / systemctl und korrigieren Sie ihn.

Es scheint, dass die Verwendung von init.d mehr Informationen darüber liefert, was bei den anderen passiert ist. Wenn ich einen der anderen Befehle verwenden sollte, können sie weitere Informationen darüber anzeigen, was getan wurde?

ubuntu@ip-172-26-12-245:~$ sudo systemctl restart pure-ftpd.service
ubuntu@ip-172-26-12-245:~$ sudo /bin/systemctl restart pure-ftpd.service
ubuntu@ip-172-26-12-245:~$ sudo /etc/init.d/pure-ftpd restart
[ ok ] Restarting pure-ftpd (via systemctl): pure-ftpd.service.
ubuntu@ip-172-26-12-245:~$ sudo service pure-ftpd restart
ubuntu@ip-172-26-12-245:~$

Ich möchte mich im Voraus bei allen bedanken, die sich die Zeit genommen haben, diese Frage zu lesen und zu beantworten.

Waqas Tariq
quelle
Unter Linux gibt es oft mehr als eine Möglichkeit, eine Aktion auszuführen. Es gibt keinen, der besser oder schlechter oder richtig oder falsch ist. Persönlich benutze ich die mit der geringsten Typisierung. Viele dieser Befehle können symbolische Links oder Rückwärtskompatibilität sein, wenn Ubuntu zu systemd wechselt.
Panther
systemctlist die bevorzugte Syntax und servicewird aus Gründen der Abwärtskompatibilität bereitgestellt. /etc/init.d/pure-ftpdo.ä. rufen die Start / Stopp-Skripte direkt auf.
Panther

Antworten:

57

Zu Beginn gibt es eine ganze Geschichte und einen Kampf zwischen dem Übergang von SysVInitzu SystemD. Anstatt jedoch zu versuchen, alles in einer Antwort zusammenzufassen, verweise ich Sie auf Google Venturing, um weitere Details zum Verlauf sowie einen bestimmten Artikel zum Thema zu erhalten:

http://www.tecmint.com/systemd-replaces-init-in-linux/

Zusammenfassend war es jedoch ein langsamer und mühsamer Übergang. Einige ältere Funktionen wurden beibehalten (z. B. init.dbis zu einem gewissen Grad). Wenn Sie die Option haben, diese systemctlfür Ihre Dienststeuerung zu verwenden, empfehle ich die Verwendung dieser Option . Es ist die absehbare Zukunft für Linux und eventuell ältere SysVInitMethoden werden als veraltet betrachtet und entfernt.

So decken Sie jeden einzelnen Punkt ab, den Sie aufgelistet haben:

  1. sudo systemctl status apache2.service

Dies ist der neue SystemDAnsatz für den Umgang mit Diensten. Künftig verwenden Anwendungen unter Linux die systemd-Methode, keine andere.

  1. sudo /bin/systemctl status apache2.service

Dies ist dasselbe wie beim vorherigen Befehl. Der einzige Unterschied in diesem Fall besteht darin, dass das $PATHAuffinden des Befehls nicht von der Umgebungsvariablen der Shell abhängt, sondern dass der Befehl explizit aufgelistet wird, indem der Pfad zum Befehl angegeben wird.

  1. sudo /etc/init.d/apache2 status

Dies ist die ursprüngliche SysVInitMethode zum Aufrufen eines Dienstes. Init-Skripte würden für einen Dienst geschrieben und in dieses Verzeichnis gestellt. Während diese Methode immer noch von vielen verwendet wird, servicewurde der Befehl, der diese Methode zum Aufrufen von Diensten in ersetzt SysVInit. Es gibt einige ältere Funktionen für diese auf neueren Systemen mit SystemD, aber die meisten neueren Programme enthalten dies nicht und nicht alle älteren Anwendungs-Init-Skripte funktionieren damit.

  1. sudo service apache2 status

Dies war das Hauptwerkzeug, das auf SysVInitSystemen für Dienste verwendet wurde. In einigen Fällen wurde nur eine Verknüpfung zu den /etc/init.d/Skripten hergestellt, in anderen Fällen wurde ein an anderer Stelle gespeichertes Init-Skript verwendet. Es sollte ein reibungsloser Übergang zur Behandlung von Dienstabhängigkeiten ermöglicht werden.


Zuletzt erwähnen Sie, dass Sie wissen möchten, wie Sie mehr Informationen aus den Befehlen herausholen können, da einige mehr Informationen liefern als andere. Dies wird fast immer von der Anwendung und dem Design ihrer Init- oder Servicedatei bestimmt. In der Regel war es jedoch erfolgreich, wenn es im Stillen abgeschlossen wurde. Um jedoch ein start, stopoder zu überprüfen , können restartSie den statusUnterbefehl verwenden, um zu sehen, wie es funktioniert. Sie haben erwähnt, dass ein statusBefehl in einem alten Init-Skript falsch ist. Das ist ein Fehler, den die Anwendungsentwickler untersuchen müssten. Da jedoch Init-Skripte zur veralteten Methode für die Behandlung von Diensten werden, ignorieren sie den Fehler möglicherweise nur, bis sie die Init-Skriptoption vollständig entfernen. Dassystemctl status sollte immer korrekt funktionieren, ansonsten sollte ein Fehler bei den Anwendungsentwicklern protokolliert werden.

TopHat
quelle
Vielen Dank für Ihre ausführliche Antwort. Ich google auch nach Antworten, aber diese hat mich wirklich verwirrt, also habe ich sie hier gepostet. Ich sehe auch, dass sudo systemctl status apache2 funktioniert, anstatt (sudo systemctl status apache2.service). Kann es schaden, auf den .service-Teil zu verzichten?
Waqas Tariq
@ WaqasTariq kein Problem! Beides sollte funktionieren. systemctlDurchsucht die Verzeichnisse, in denen die Servicedateien gespeichert sind, und fügt den ".service" für Sie hinzu, wenn er gefunden wird. Wenn Sie beispielsweise nach dem Schreiben einmal auf die Tabulatortaste klicken sudo systemctl status apache2, sollte dies durch Hinzufügen .servicefür Sie vervollständigt werden . Wenn es mehr als eine apache2-systemctl-Datei gibt (wie z. B. .serviceund a), müssen .targetSie zweimal die Tabulatortaste
drücken
Ich habs. Vielen Dank für Ihre Antworten und Ihre Zeit.
Waqas Tariq
@WaqasTariq herzlich willkommen!
TopHat