Linux: systemctl daemon-reload

LinuxLinuxBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

Dieses Tutorial führt Sie durch den Prozess der Verwendung des Befehls systemctl daemon-reload zur Verwaltung von Systemdaemons und -diensten auf Ihrem Linux-System. Systemd ist der Standard-Service-Manager für die meisten modernen Linux-Distributionen, und das Verständnis, wie man Dienstkonfigurationen richtig aktualisiert, ist eine essentielle Fähigkeit für Linux-Benutzer und -Administratoren.

In diesem Lab werden Sie lernen, wann und warum Sie den Befehl systemctl daemon-reload verwenden sollten, Dienstdateien erstellen und ändern sowie Konfigurationsänderungen anwenden, ohne die Betriebsabläufe Ihres Systems zu stören. Am Ende dieses Tutorials werden Sie sich sicher mit Systemd-Diensten umgehen und Konfigurationsänderungen effektiv anwenden können.

Für das Lernen in diesem Lab ist eine Internetverbindung erforderlich. Daher können nur LabEx Pro -Benutzer die virtuelle Maschine starten. Upgrade Sie Ihr Konto auf Pro.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL linux(("Linux")) -.-> linux/SystemInformationandMonitoringGroup(["System Information and Monitoring"]) linux/SystemInformationandMonitoringGroup -.-> linux/service("Service Managing") subgraph Lab Skills linux/service -.-> lab-390500{{"Linux: systemctl daemon-reload"}} end

Grundlagen von systemd und systemctl verstehen

Systemd ist der Dienst- und Systemmanager für die meisten modernen Linux-Distributionen, einschließlich Ubuntu 22.04, das wir in diesem Lab verwenden. Es ist für das Starten und Verwalten von Systemdiensten verantwortlich, und systemctl ist das primäre Befehlszeilentool, das verwendet wird, um mit systemd zu interagieren.

Was ist ein System-Dämon?

Ein Daemon ist ein Hintergrundprozess, der kontinuierlich auf Ihrem Linux-System läuft. Diese Prozesse führen verschiedene Aufgaben aus, wie das Bereitstellen von Webseiten (Apache, Nginx), das Verwalten von Datenbanken (MySQL, PostgreSQL) oder das Verarbeiten von Systemereignissen. Systemd verwaltet diese Daemons über standardisierte Konfigurationsdateien, die als "Unit-Dateien" bezeichnet werden.

Grundlegende systemctl-Befehle

Lassen Sie uns beginnen, einige grundlegende systemctl-Befehle zu erkunden, um den aktuellen Zustand Ihres Systems zu verstehen:

  1. Öffnen Sie ein Terminal, indem Sie auf das Terminal-Symbol klicken.

  2. Listen Sie alle aktiven Systemdienste mit dem folgenden Befehl auf:

systemctl list-units --type=service
systemctl list-units --type=service

Dieser Befehl zeigt alle derzeit aktiven Dienste auf Ihrem System an. Sie sollten eine Ausgabe ähnlich der folgenden sehen:

EINHEIT                                      LADEN   AKTIV SUB     BESCHREIBUNG
accounts-daemon.service                   geladen aktiv laufend Accounts Service
apparmor.service                          geladen aktiv beendet AppArmor Initialisierung
avahi-daemon.service                      geladen aktiv laufend Avahi mDNS/DNS-SD-Stack
...

Drücken Sie Ctrl+C oder Q, um den Befehl zu beenden.

  1. Überprüfen Sie den Status eines bestimmten Diensts, z. B. des SSH-Diensts:
systemctl status ssh
systemctl status ssh

Sie sollten detaillierte Informationen über den SSH-Dienst sehen, einschließlich dessen Aktivität, seiner Prozess-ID und neuerer Protokolleinträge:

● ssh.service - OpenBSD Secure Shell server
     Geladen: geladen (/lib/systemd/system/ssh.service; aktiviert; Anbieterstandard: aktiviert)
     Aktiv: aktiv (läuft) seit Tue 2023-06-13 12:34:56 UTC; 3h 25min zuvor
       Docs: man:sshd(8)
             man:sshd_config(5)
    Prozess: 1234 ExecStartPre=/usr/sbin/sshd -t (Code=beendet, Status=0/SUCCESS)
   Haupt-PID: 1235 (sshd)
      Aufgaben: 1 (Grenze: 4915)
     Arbeitsspeicher: 5.6M
        CPU: 236ms
     CGroup: /system.slice/ssh.service
             └─1235 "sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups"
  1. Untersuchen Sie, wo die systemd-Service-Dateien gespeichert sind. Dies sind die Dateien, mit denen wir in den nächsten Schritten arbeiten werden:
ls -l /etc/systemd/system/

Dieses Verzeichnis enthält Service-Unit-Dateien, die definieren, wie systemd Dienste verwaltet. Sie sollten mehrere .service-Dateien und Symbolische Links sehen.

  1. System-provided unit files sind in einem anderen Verzeichnis gespeichert. Untersuchen Sie sie:
ls -l /lib/systemd/system/

Dieses Verzeichnis enthält die standardmäßigen Service-Unit-Dateien, die mit Ihrem System zusammenkommen.

Jetzt, da Sie die Grundlagen von systemd und wie Sie den Status von Diensten überprüfen, verstehen, sind Sie bereit, in den nächsten Schritten Service-Dateien zu erstellen und zu modifizieren.

Erstellen einer einfachen systemd-Service-Datei

In diesem Schritt werden Sie eine einfache systemd-Service-Datei erstellen, die ein benutzerdefiniertes Skript ausführt. Dies wird Ihnen helfen, zu verstehen, wie Service-Dateien funktionieren und wie Sie sie modifizieren können.

Erstellen eines einfachen Skripts

Zunächst erstellen wir ein einfaches Skript, das unser Dienst ausführen wird:

  1. Erstellen Sie ein Verzeichnis für Ihr Skript:
mkdir -p ~/project/scripts
  1. Verwenden Sie den Texteditor nano, um ein einfaches Skript zu erstellen:
nano ~/project/scripts/hello-service.sh
  1. Fügen Sie den folgenden Inhalt in das Skript ein:
#!/bin/bash

while true; do
  echo "Hello from custom service: $(date)" >> /tmp/hello-service.log
  sleep 10
done

Drücken Sie Ctrl+X, um den Editor zu verlassen, dann Y, um die Datei zu speichern, und dann Enter, um den Dateinamen zu bestätigen.

Dieses Skript schreibt einfach eine Nachricht mit dem aktuellen Datum alle 10 Sekunden in eine Log-Datei.

  1. Machen Sie das Skript ausführbar:
chmod +x ~/project/scripts/hello-service.sh

Erstellen einer systemd-Service-Unit-Datei

Jetzt erstellen wir eine systemd-Service-Datei, die dieses Skript ausführen wird:

  1. Erstellen Sie eine neue Service-Datei mit sudo-Rechten:
sudo nano /etc/systemd/system/hello-service.service
  1. Fügen Sie den folgenden Inhalt in die Service-Datei ein:
[Unit]
Description=Hello Service Demo
After=network.target

[Service]
Type=simple
ExecStart=/home/labex/project/scripts/hello-service.sh
Restart=on-failure
User=labex

[Install]
WantedBy=multi-user.target

Lassen Sie uns uns jeden Abschnitt dieser Datei ansehen:

  • [Unit]: Enthält Metadaten und Abhängigkeiten

    • Description: Eine für Menschen lesbare Beschreibung des Diensts
    • After: Gibt an, dass dieser Dienst nach dem Netzwerkstart gestartet werden soll
  • [Service]: Definiert, wie der Dienst ausgeführt werden soll

    • Type=simple: Der Dienst startet sofort
    • ExecStart: Der Befehl, der ausgeführt werden soll (unser Skript)
    • Restart: Startet den Dienst automatisch neu, wenn er fehlschlägt
    • User: Das Benutzerkonto, unter dem der Dienst ausgeführt werden soll
  • [Install]: Definiert, wann und wie der Dienst aktiviert werden soll

    • WantedBy: Gibt an, wann der Dienst gestartet werden soll (multi-user.target bedeutet normale Systembetrieb)
  1. Speichern Sie die Datei und verlassen Sie den Editor (drücken Sie in nano Ctrl+X, dann Y, dann Enter).

  2. Untersuchen Sie unsere neu erstellte Service-Datei:

cat /etc/systemd/system/hello-service.service

Sie sollten den Inhalt sehen, den Sie gerade in die Datei hinzugefügt haben.

cat /etc/systemd/system/hello-service.service

Im nächsten Schritt werden Sie lernen, wie Sie diesen Dienst mit dem Befehl systemctl daemon-reload laden und starten.

Verwenden von systemctl daemon-reload, um Änderungen anzuwenden

Jetzt, da Sie eine systemd-Service-Datei erstellt haben, müssen Sie systemd über diesen neuen Dienst informieren. Hier kommt der Befehl systemctl daemon-reload ins Spiel.

Was ist systemctl daemon-reload?

Der Befehl systemctl daemon-reload weist systemd an, alle Service-Dateien neu zu laden und seine interne Konfiguration zu aktualisieren. Dies ist erforderlich, wenn Sie:

  • Eine neue Service-Datei erstellen
  • Eine vorhandene Service-Datei modifizieren
  • Eine Service-Datei löschen

Ohne diesen Befehl zu verwenden, wird systemd Ihre Änderungen nicht erkennen.

Systemd-Konfiguration neu laden

  1. Führen Sie den folgenden Befehl aus, um die Systemd-Konfiguration neu zu laden:
sudo systemctl daemon-reload

Dieser Befehl erzeugt keine Ausgabe, wenn er erfolgreich ist, aktualisiert jedoch die interne Konfiguration von systemd.

  1. Jetzt überprüfen wir, ob systemd unseren neuen Dienst erkennt:
systemctl status hello-service

Sie sollten eine Ausgabe sehen, die zeigt, dass der Dienst geladen, aber inaktiv ist:

● hello-service.service - Hello Service Demo
     Geladen: geladen (/etc/systemd/system/hello-service.service; deaktiviert; Anbieterstandard: aktiviert)
     Aktiv: inaktiv (gestorben)

Starten des Diensts

  1. Starten Sie unseren Dienst:
sudo systemctl start hello-service
  1. Überprüfen Sie den Status erneut, um zu sehen, ob er läuft:
systemctl status hello-service
systemctl status hello-service

Sie sollten jetzt sehen, dass der Dienst aktiv und läuft:

● hello-service.service - Hello Service Demo
     Geladen: geladen (/etc/systemd/system/hello-service.service; deaktiviert; Anbieterstandard: aktiviert)
     Aktiv: aktiv (läuft) seit [Zeitstempel]; [Zeit] zuvor
   Haupt-PID: [PID-Nummer] (hello-service.sh)
      Aufgaben: 2 (Grenze: 4915)
     Arbeitsspeicher: 592.0K
        CPU: 5ms
     CGroup: /system.slice/hello-service.service
             └─[PID-Nummer] /bin/bash /home/labex/project/scripts/hello-service.sh
  1. Vergewissern Sie sich, dass unser Dienst tatsächlich funktioniert, indem Sie die Log-Datei überprüfen, die er erstellt:
cat /tmp/hello-service.log

Sie sollten mehrere Zeilen der Ausgabe sehen, ähnlich der folgenden:

Hello from custom service: Wed Jun 14 15:30:45 UTC 2023
Hello from custom service: Wed Jun 14 15:30:55 UTC 2023
Hello from custom service: Wed Jun 14 15:31:05 UTC 2023

Die Protokolleinträge werden das aktuelle Datum und die Uhrzeit anzeigen, was bestätigt, dass unser Dienst läuft und das Skript wie erwartet ausführt.

  1. Aktivieren Sie den Dienst, um ihn automatisch beim Systemstart zu starten:
sudo systemctl enable hello-service

Sie sollten eine Ausgabe ähnlich der folgenden sehen:

Created symlink /etc/systemd/system/multi-user.target.wants/hello-service.service → /etc/systemd/system/hello-service.service.

Dies bedeutet, dass der Dienst jetzt aktiviert ist und beim Systemstart automatisch gestartet werden wird.

Jetzt haben Sie erfolgreich einen Dienst erstellt, verwendet systemctl daemon-reload, um systemd darüber zu informieren, und den Dienst gestartet. Im nächsten Schritt werden Sie den Dienst modifizieren und die Änderungen anwenden.

Ändern der Service-Konfiguration

In diesem Schritt werden Sie Ihre Service-Konfiguration ändern und die Änderungen mit systemctl daemon-reload anwenden. Dies wird die Wichtigkeit dieses Befehls bei der Aktualisierung von Service-Konfigurationen demonstrieren.

Ändern der Service-Datei

Ändern Sie unseren Dienst, um zu ändern, wie häufig Nachrichten protokolliert werden:

  1. Bearbeiten Sie die Service-Datei:
sudo nano /etc/systemd/system/hello-service.service
  1. Fügen Sie eine neue Umgebungsvariable in den Abschnitt [Service] hinzu, um das Schlafintervall zu steuern. Fügen Sie diese Zeile nach der Zeile User=labex hinzu:
Environment="SLEEP_INTERVAL=5"
  1. Speichern Sie die Datei und verlassen Sie sie (drücken Sie in nano Ctrl+X, dann Y, dann Enter).

  2. Bearbeiten Sie jetzt das Skript, um diese Umgebungsvariable zu verwenden:

nano ~/project/scripts/hello-service.sh
  1. Ändern Sie das Skript, um die Umgebungsvariable zu verwenden (ersetzen Sie den gesamten Inhalt damit):
#!/bin/bash

## Standardmäßig 10 Sekunden, wenn die Umgebungsvariable nicht gesetzt ist
INTERVAL=${SLEEP_INTERVAL:-10}

while true; do
  echo "Hello from custom service: $(date) - Interval: ${INTERVAL}s" >> /tmp/hello-service.log
  sleep $INTERVAL
done
  1. Speichern Sie die Datei und verlassen Sie den Editor (drücken Sie in nano Ctrl+X, dann Y, dann Enter).

Anwenden der Änderungen

Jetzt, da Sie sowohl an der Service-Datei als auch am Skript Änderungen vorgenommen haben, müssen Sie diese Änderungen anwenden:

  1. Laden Sie zunächst die Systemd-Konfiguration neu:
sudo systemctl daemon-reload
  1. Starten Sie dann den Dienst neu, um die Änderungen anzuwenden:
sudo systemctl restart hello-service
  1. Überprüfen Sie den Status des Diensts:
systemctl status hello-service

Sie sollten sehen, dass der Dienst mit der aktualisierten Konfiguration läuft.

  1. Vergewissern Sie sich, dass die Änderungen wirksam sind, indem Sie die Log-Datei überprüfen:
sleep 15 ## Warte, um einige Protokolleinträge zu sammeln
cat /tmp/hello-service.log | tail -5

Sie sollten jetzt sehen, dass der Dienst Nachrichten alle 5 Sekunden statt alle 10 Sekunden protokolliert und die Protokolleinträge die neue Intervallinformation enthalten sollten:

Hello from custom service: Wed Jun 14 15:45:10 UTC 2023 - Interval: 5s
Hello from custom service: Wed Jun 14 15:45:15 UTC 2023 - Interval: 5s
Hello from custom service: Wed Jun 14 15:45:20 UTC 2023 - Interval: 5s
cat /tmp/hello-service.log | tail -5

Verständnis dessen, was passiert ist

Lassen Sie uns verstehen, was gerade passiert ist:

  1. Sie haben die Service-Datei geändert, um eine Umgebungsvariable hinzuzufügen.
  2. Sie haben das Skript aktualisiert, um diese Umgebungsvariable zu verwenden.
  3. Sie haben systemctl daemon-reload ausgeführt, um systemd über die Änderungen an der Service-Datei zu informieren.
  4. Sie haben den Dienst neu gestartet, um diese Änderungen anzuwenden.

Ohne den Befehl systemctl daemon-reload hätte systemd die Änderungen an der Service-Datei nicht erkannt, und die Umgebungsvariable wäre nicht an das Skript übergeben worden, wenn der Dienst neu gestartet wurde.

Dies demonstriert, warum systemctl daemon-reload unbedingt erforderlich ist, wenn Sie Service-Dateien ändern - es stellt sicher, dass systemd Ihre Änderungen kennt, bevor Sie versuchen, sie durch Starten oder Neustarten von Diensten anzuwenden.

Problembehandlung und bewährte Praktiken

In diesem letzten Schritt werden Sie über häufige Probleme lernen, die bei der Arbeit mit systemd-Diensten auftreten können, und wie Sie diese beheben können. Sie werden auch einige bewährte Praktiken für die Arbeit mit systemctl daemon-reload kennenlernen.

Problembehandlung von häufigen Problemen

1. Dienst kann nicht gestartet werden

Wenn Ihr Dienst nicht starten kann, ist der erste Schritt, seinen Status zu überprüfen:

systemctl status hello-service

Dies liefert oft detaillierte Fehlerinformationen. Lassen Sie uns absichtlich einen Fehler erzeugen, um zu sehen, wie man ihn behebt:

  1. Bearbeiten Sie die Service-Datei:
sudo nano /etc/systemd/system/hello-service.service
  1. Ändern Sie die Zeile ExecStart, um auf ein nicht existierendes Skript zu verweisen:
ExecStart=/home/labex/project/scripts/non-existent.sh
  1. Speichern Sie die Datei und verlassen Sie den Editor.

  2. Laden Sie die Systemd-Konfiguration neu und versuchen, den Dienst neu zu starten:

sudo systemctl daemon-reload
sudo systemctl restart hello-service
  1. Überprüfen Sie den Status, um den Fehler zu sehen:
systemctl status hello-service

Sie sollten Fehler Nachrichten sehen, die anzeigen, dass das Skript nicht existiert:

● hello-service.service - Hello Service Demo
     Geladen: geladen (/etc/systemd/system/hello-service.service; aktiviert; Anbieterstandard: aktiviert)
     Aktiv: fehlgeschlagen (Result: exit-code) seit [Zeitstempel]; [Zeit] zuvor
    Prozess: [pid] ExecStart=/home/labex/project/scripts/non-existent.sh (code=beendet, Status=203/EXEC)
   Haupt-PID: [pid] (code=beendet, Status=203/EXEC)
        CPU: 5ms

[Zeitstempel] systemd[1]: Started Hello Service Demo.
[Zeitstempel] systemd[pid]: hello-service.service: Failed to execute command: No such file or directory
[Zeitstempel] systemd[pid]: hello-service.service: Failed at step EXEC spawning /home/labex/project/scripts/non-existent.sh: No such file or directory
[Zeitstempel] systemd[1]: hello-service.service: Main process exited, code=exited, status=203/EXEC
[Zeitstempel] systemd[1]: hello-service.service: Failed with result 'exit-code'.
  1. Reparieren Sie die Service-Datei, um auf das richtige Skript zurückzuverweisen:
sudo nano /etc/systemd/system/hello-service.service
  1. Ändern Sie die Zeile ExecStart zurück zu:
ExecStart=/home/labex/project/scripts/hello-service.sh
  1. Speichern Sie und verlassen Sie, laden Sie dann neu und starten Sie neu:
sudo systemctl daemon-reload
sudo systemctl restart hello-service
  1. Vergewissern Sie sich, dass der Dienst wieder läuft:
systemctl status hello-service

2. Lesen von Journalprotokollen für weitere Informationen

Beim Problembehandlung können Sie journalctl verwenden, um detaillierte Protokolle anzuzeigen:

sudo journalctl -u hello-service

Dies zeigt alle Protokolle für die hello-service-Einheit, die für das Diagnostizieren von Problemen unschätzbare Informationen liefern können.

Um nur die neuesten Protokolle anzuzeigen:

sudo journalctl -u hello-service -n 20

Um die Protokolle in Echtzeit zu verfolgen (ähnlich tail -f):

sudo journalctl -u hello-service -f

Drücken Sie Ctrl+C, um den Protokollverfolgungsmodus zu beenden.

Bewährte Praktiken für die Arbeit mit systemctl daemon-reload

Hier sind einige bewährte Praktiken, die Sie bei der Arbeit mit systemd und dem daemon-reload-Befehl befolgen sollten:

  1. Immer neu laden nach Änderungen: Führen Sie immer systemctl daemon-reload aus, nachdem Sie systemd-Unit-Dateien geändert, hinzugefügt oder entfernt haben.

  2. Syntax überprüfen, bevor Sie anwenden: Sie können den folgenden Befehl verwenden, um Syntaxfehler in Ihren Service-Dateien zu überprüfen, bevor Sie neu laden:

sudo systemd-analyze verify /etc/systemd/system/hello-service.service

Wenn keine Fehler vorliegen, liefert dieser Befehl keine Ausgabe. Alle Syntaxfehler werden gemeldet.

  1. Service-Vorlagen verwenden: Für Dienste, die mehrere Instanzen erfordern, verwenden Sie Service-Vorlagen (Dateien mit dem Namen [email protected]), um Duplikate zu vermeiden.

  2. Service-Abhängigkeiten überprüfen: Stellen Sie sicher, dass Ihre Dienste die richtigen After=- und Requires=-Direktiven haben, um sicherzustellen, dass sie in der richtigen Reihenfolge gestartet werden.

  3. Gut aufräumen: Wenn Sie einen Dienst entfernen, stellen Sie sicher, dass Sie ihn stoppen und deaktivieren, bevor Sie die Service-Datei löschen:

sudo systemctl stop hello-service
sudo systemctl disable hello-service
sudo rm /etc/systemd/system/hello-service.service
sudo systemctl daemon-reload

Lassen Sie uns jetzt unseren Beispiel-Dienst aufräumen:

sudo systemctl stop hello-service
sudo systemctl disable hello-service

Sie sollten eine Ausgabe sehen, die angibt, dass der Symbolische Link entfernt wurde:

Removed /etc/systemd/system/multi-user.target.wants/hello-service.service.

Wir werden die Service-Datei noch nicht löschen, da wir sie noch für die Verifikation benötigen.

Jetzt verstehen Sie, wie Sie systemd-Dienste erstellen, modifizieren und beheben, sowie die Wichtigkeit des systemctl daemon-reload-Befehls bei der Verwaltung dieser Dienste.

Zusammenfassung

In diesem Lab haben Sie gelernt, wie Sie den Befehl systemctl daemon-reload verwenden, um Systemdaemons und Dienste auf Ihrem Linux-System zu verwalten. Sie haben:

  • Die Grundlagen von systemd und systemctl verstanden
  • Eine benutzerdefinierte systemd-Service-Datei erstellt
  • systemctl daemon-reload verwendet, um Änderungen an Service-Konfigurationen anzuwenden
  • Service-Dateien geändert und diese Änderungen angewandt
  • gelernt, wie man häufige Probleme behebt und bewährte Praktiken befolgt

Der Befehl systemctl daemon-reload ist essentiell, wenn Sie mit systemd-Diensten arbeiten, da er sicherstellt, dass der systemd-Manager Änderungen an Service-Konfigurationen erkennt. Ohne diesen Befehl würden Ihre Änderungen an Service-Dateien erst beim nächsten Neustart vom System erkannt werden.

Dieses Wissen wird wertvoll sein, wenn Sie weiterhin mit Linux-Systemen arbeiten, da es Ihnen ermöglicht, Dienste effektiv zu verwalten und sicherzustellen, dass Ihre Konfigurationsänderungen richtig angewendet werden.