Verwaltung von Diensten in Red Hat Enterprise Linux

Red Hat Enterprise LinuxRed Hat Enterprise LinuxBeginner
Jetzt üben

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

Einführung

In diesem Labor erhalten Sie praktische Erfahrung in der Verwaltung von Systemdiensten unter RHEL mithilfe des Befehls systemctl. Sie lernen, alle geladenen und aktiven Dienste anzuzeigen, den Status bestimmter Dienste zu überprüfen und ihr Laufzeitverhalten durch Starten, Stoppen und Neustarten zu steuern. Darüber hinaus werden Sie erkunden, wie Sie Dienstkonfigurationen neu laden, Dienste für den automatischen Start beim Booten aktivieren oder deaktivieren und die erweiterten Konzepte des Maskierens und Entmaskierens von Diensten verstehen, um deren Aktivierung zu verhindern.

Dieser praktische Leitfaden vermittelt Ihnen wichtige Fähigkeiten für die Systemverwaltung, die es Ihnen ermöglichen, den Lebenszyklus von Diensten, die für den Betrieb Ihres RHEL-Systems unerlässlich sind, auch in containerisierten Umgebungen, in denen systemctl mit von systemd verwalteten Diensten interagiert, effektiv zu überwachen und zu verwalten.

Hinweis: Dieses Labor verwendet eine Ubuntu 22.04-Umgebung, um eine funktionale systemd-Umgebung für die Übung von systemctl-Befehlen bereitzustellen. Die hier demonstrierten Konzepte, Befehle und Verfahren entsprechen denen von RHEL-Systemen, da beide Distributionen systemd als ihr Dienstverwaltungssystem verwenden.

Anzeigen aller geladenen und aktiven Dienste mit systemctl

In diesem Schritt lernen Sie, wie Sie automatisch gestartete Systemprozesse mithilfe des Befehls systemctl identifizieren. Während systemctl typischerweise verwendet wird, um systemd-Dienste zu verwalten, ist in einer containerisierten Umgebung wie der LabEx-VM möglicherweise systemd selbst nicht als primäres Init-System aktiv. systemctl-Befehle können jedoch weiterhin verwendet werden, um Dienste abzufragen und zu steuern, die von systemd innerhalb des Containers verwaltet werden, oder um zu verstehen, wie sich Dienste in einer vollständigen systemd-Umgebung verhalten würden.

Zunächst betrachten wir die Liste aller aktuell geladenen und aktiven Dienst-Units. Der Befehl systemctl list-units --type=service dient diesem Zweck. Dieser Befehl zeigt Dienst-Units an, die der systemd-Daemon (falls aktiv) erfolgreich geparst und in den Arbeitsspeicher geladen hat und die derzeit aktiv sind.

Öffnen Sie Ihr Terminal in der LabEx-VM-Umgebung. Sie sind bereits als Benutzer labex angemeldet und Ihr aktuelles Verzeichnis ist ~/project.

Führen Sie den folgenden Befehl aus, um alle geladenen und aktiven Dienst-Units aufzulisten:

systemctl list-units --type=service

Sie erhalten eine Ausgabe ähnlich dieser, die verschiedene Dienste und deren Zustände anzeigt:

EINHEIT                  LADEN    AKTIV  SUB      BESCHREIBUNG
atd.service           geladen  aktiv  laufend  Job-Warteschlangen-Tools
auditd.service        geladen  aktiv  laufend  Sicherheits-Auditing-Dienst
chronyd.service       geladen  aktiv  laufend  NTP-Client/Server
crond.service         geladen  aktiv  laufend  Befehlsplaner
dbus.service          geladen  aktiv  laufend  D-Bus-System-Nachrichtenbus
...Ausgabe ausgelassen...

Lassen Sie uns die Spalten der Ausgabe aufschlüsseln:

  • EINHEIT: Dies ist der Name der Dienst-Unit, typischerweise endend mit .service.
  • LADEN: Zeigt an, ob der systemd-Daemon die Konfiguration der Unit erfolgreich geparst und in den Arbeitsspeicher geladen hat. geladen bedeutet, dass dies erfolgreich war.
  • AKTIV: Dies ist der allgemeine Aktivierungszustand der Unit. aktiv bedeutet im Allgemeinen, dass die Unit erfolgreich gestartet wurde.
  • SUB: Dies ist der detailliertere Aktivierungszustand, der weitere Informationen liefert. Für laufende Dienste ist laufend üblich.
  • BESCHREIBUNG: Eine kurze Beschreibung dessen, was der Dienst tut.

Drücken Sie Strg+C, um den Befehl zu beenden.

Als Nächstes können Sie die Option --all mit systemctl list-units --type=service verwenden, um alle Dienst-Units unabhängig von ihrem Aktivierungszustand (aktiv, inaktiv, fehlgeschlagen usw.) aufzulisten. Dies kann nützlich sein, um Dienste zu sehen, die installiert, aber derzeit nicht ausgeführt werden.

Führen Sie den folgenden Befehl aus:

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

Die Ausgabe enthält Dienste, die inaktiv oder in anderen Zuständen sind, und bietet einen umfassenderen Überblick:

EINHEIT                          LADEN      AKTIV   SUB     BESCHREIBUNG
  atd.service                 geladen    aktiv   laufend Job-Warteschlangen-Tools
  auditd.service              geladen    aktiv   laufend Sicherheits-Auditing ...
  auth-rpcgss-module.service  geladen    inaktiv  tot    Kernel-Modul ...
  chronyd.service             geladen    aktiv   laufend NTP-Client/Server
  cpupower.service            geladen    inaktiv  tot    CPU-Leistungsverwaltung ...
  crond.service               geladen    aktiv   laufend Befehlsplaner
  dbus.service                geladen    aktiv   laufend D-Bus-System-Nachrichtenbus
● display-manager.service     nicht gefunden inaktiv  tot    display-manager.service
...Ausgabe ausgelassen...

Schließlich können Sie den Befehl systemctl list-unit-files --type=service verwenden, um den Status aller installierten Unit-Dateien anzuzeigen, einschließlich derer, die nicht geladen oder aktiv sind. Dieser Befehl zeigt an, ob ein Dienst aktiviert (beim Booten startet), deaktiviert (beim Booten nicht startet), statisch (nicht direkt aktiviert werden kann, aber möglicherweise von einer anderen Unit gestartet wird) oder maskiert (vom Starten verhindert wird).

Führen Sie den folgenden Befehl aus:

systemctl list-unit-files --type=service

Sie erhalten eine Ausgabe ähnlich dieser, die den STATUS und das VORHERIGE VOREINSTELLUNG für jede Dienst-Unit-Datei anzeigt:

EINHEIT-DATEI                         STATUS       VORHERIGE VOREINSTELLUNG
arp-ethers.service                deaktiviert    deaktiviert
atd.service                       aktiviert     aktiviert
auditd.service                    aktiviert     aktiviert
auth-rpcgss-module.service        statisch      -
[email protected]                   Alias       -
blk-availability.service          deaktiviert    deaktiviert
...Ausgabe ausgelassen...

Dieser Befehl ist besonders nützlich, um zu verstehen, welche Dienste konfiguriert sind, um beim Systemstart automatisch zu starten.

Status eines bestimmten Dienstes mit systemctl status überprüfen

In diesem Schritt lernen Sie, wie Sie den detaillierten Status eines bestimmten Dienstes mithilfe des Befehls systemctl status überprüfen. Dieser Befehl liefert umfassende Informationen über einen Dienst, einschließlich ob er läuft, seine Prozess-ID, den Speicherverbrauch und die letzten Protokollmeldungen.

Wir verwenden den Dienst cron.service (Cron-Daemon) als Beispiel. Der Cron-Daemon ist ein häufiger Dienst, der geplante Aufgaben bearbeitet und sowohl in Ubuntu als auch in RHEL mit demselben Dienstnamen verfügbar ist.

Öffnen Sie Ihr Terminal in der LabEx-VM-Umgebung. Stellen Sie sicher, dass Sie sich in Ihrem Verzeichnis ~/project befinden.

Führen Sie den folgenden Befehl aus, um den Status des Dienstes cron.service zu überprüfen:

systemctl status cron.service

Sie erhalten eine detaillierte Ausgabe ähnlich dieser:

● cron.service - Regelmäßiger Hintergrundprogramm-Verarbeitung-Daemon
     Geladen: geladen (/lib/systemd/system/cron.service; aktiviert; Vendor-Voreinstellung: aktiviert)
     Aktiv: aktiv (läuft) seit Mo 2022-03-14 05:38:10 EDT; vor 25 Minuten
       Docs: man:cron(8)
   Haupt-PID: 1089 (cron)
      Aufgaben: 1 (Limit: 35578)
     Speicher: 1,2 MB
        CPU: 12 ms
     CGroup: /system.slice/cron.service
             └─1089 /usr/sbin/cron -f

Mrz 14 05:38:10 workstation systemd[1]: Starting Regular background program processing daemon...
Mrz 14 05:38:10 workstation cron[1089]: (CRON) INFO (pidfile fd = 3)
Mrz 14 05:38:10 workstation cron[1089]: (CRON) INFO (Ausführung von @reboot-Jobs)
Mrz 14 05:38:10 workstation systemd[1]: Started Regular background program processing daemon.
...Ausgabe ausgelassen...

Betrachten wir die wichtigsten Felder der Ausgabe:

  • Geladen: Diese Zeile zeigt Ihnen, ob die Konfigurationsdatei der Dienst-Unit verarbeitet wurde. Sie zeigt auch den Pfad zur Unit-Datei (/usr/lib/systemd/system/sshd.service) und ihren Aktivierungsstatus (aktiviert bedeutet, dass sie beim Booten gestartet werden soll).
  • Aktiv: Dies ist entscheidend. Es gibt den aktuellen Status des Dienstes an. aktiv (läuft) bedeutet, dass der Dienst aktuell aktiv ist und seine Prozesse ausgeführt werden. Es zeigt auch, wie lange er aktiv ist. Andere Zustände könnten inaktiv (nicht ausgeführt), aktiv (beendet) (eine einmalige Aufgabe abgeschlossen) oder fehlgeschlagen (ein Fehler aufgetreten) sein.
  • Docs: Bietet Verweise auf Manpages für weitere Informationen zum Dienst.
  • Haupt-PID: Die Prozess-ID (PID) des Hauptprozesses, der mit dem Dienst verbunden ist, zusammen mit dem Befehlsnamen.
  • Aufgaben: Die Anzahl der Aufgaben (Threads), die der Dienst derzeit verwendet.
  • Speicher: Die Menge an Speicher, die der Dienst verbraucht.
  • CPU: Die von dem Dienst verbrauchte CPU-Zeit.
  • CGroup: Informationen zur Kontrollgruppe, zu der der Dienst gehört, die für die Ressourcenverwaltung verwendet wird.
  • Die Zeilen unter CGroup zeigen die letzten Protokollmeldungen zum Dienst, die Einblicke in den Start und die laufenden Aktivitäten geben.

Zusätzlich zu systemctl status gibt es einfachere Befehle, um bestimmte Aspekte des Dienststatus schnell zu überprüfen:

  • Um zu überprüfen, ob ein Dienst aktiv ist:

    systemctl is-active cron.service

    Erwartete Ausgabe:

    aktiv
  • Um zu überprüfen, ob ein Dienst aktiviert ist (konfiguriert, um beim Booten zu starten):

    systemctl is-enabled cron.service

    Erwartete Ausgabe:

    aktiviert
  • Um zu überprüfen, ob ein Dienst fehlgeschlagen ist:

    systemctl is-failed cron.service

    Erwartete Ausgabe (falls korrekt ausgeführt):

    aktiv

    Wenn ein Dienst Probleme beim Starten oder Ausführen hatte, gibt dieser Befehl fehlgeschlagen zurück.

Diese Befehle sind nützlich für Skripte oder schnelle Prüfungen, wenn Sie nicht die vollständige detaillierte Ausgabe von systemctl status benötigen.

Starten, Stoppen und Neustarten eines Dienstes mit systemctl

In diesem Schritt lernen Sie, wie Sie den Lebenszyklus von Systemdiensten mit systemctl-Befehlen verwalten. Sie üben das Starten, Stoppen und Neustarten eines Dienstes. Für diese Übung verwenden wir einen Dummy-Dienst, den wir erstellen. Dieser Ansatz stellt sicher, dass wir einen Dienst sicher manipulieren können, ohne kritische Systemfunktionen zu beeinträchtigen.

Zuerst erstellen wir eine einfache Dienst-Unit-Datei. Diese Datei definiert einen Dienst, der alle paar Sekunden einen Zeitstempel in eine Protokolldatei schreibt.

Erstellen Sie eine neue Dienst-Unit-Datei namens mytest.service direkt im systemd-Systemverzeichnis mit nano:

sudo nano /etc/systemd/system/mytest.service

Fügen Sie den folgenden Inhalt in den nano-Editor ein:

[Unit]
Description=Mein Testdienst
After=network.target

[Service]
Type=simple
ExecStart=/bin/bash -c 'while true; do echo "$(date): Mein Testdienst läuft." >> /tmp/mytest.log; sleep 5; done'
ExecStop=/bin/bash -c 'echo "$(date): Mein Testdienst gestoppt." >> /tmp/mytest.log'
Restart=on-failure

[Install]
WantedBy=multi-user.target
  • [Unit]: Enthält allgemeine Informationen über die Unit. Description liefert einen lesbaren Namen, und After=network.target gibt an, dass dieser Dienst nach dem Hochfahren des Netzwerks starten soll.
  • [Service]: Definiert das Verhalten des Dienstes.
    • Type=simple: Gibt an, dass es sich um einen einfachen Diensttyp handelt, bei dem der ExecStart-Befehl der Hauptprozess ist.
    • ExecStart: Der Befehl, der ausgeführt wird, wenn der Dienst startet. Hier ist es eine Bash-Schleife, die alle 5 Sekunden einen Zeitstempel mit der Nachricht "Mein Testdienst läuft." in /tmp/mytest.log schreibt.
    • ExecStop: Der Befehl, der ausgeführt wird, wenn der Dienst gestoppt wird. Er schreibt eine Stop-Nachricht in das Protokoll.
    • Restart=on-failure: Konfiguriert den Dienst zum Neustart, wenn er mit einem Nicht-Null-Status beendet wird.
  • [Install]: Enthält Informationen darüber, wie der Dienst installiert werden soll. WantedBy=multi-user.target bedeutet, dass dieser Dienst gestartet werden soll, wenn das System den Multi-User-Runlevel erreicht.

Speichern Sie die Datei, indem Sie Strg+X, dann Y zum Bestätigen und Eingabe zum Speichern der Datei drücken.

Laden Sie nun den systemd-Daemon neu, damit er die neue Dienstdatei erkennt:

sudo systemctl daemon-reload

Starten eines Dienstes

Um einen Dienst zu starten, verwenden Sie den Befehl systemctl start.

Führen Sie den folgenden Befehl aus, um mytest.service zu starten. Beachten Sie, dass wir sudo verwenden müssen, da systemctl-Operationen normalerweise Root-Rechte benötigen.

sudo systemctl start mytest.service

Es wird keine sofortige Ausgabe geben, wenn der Befehl erfolgreich ist.

Überprüfen Sie nun, ob der Dienst läuft, indem Sie seinen Status abfragen:

systemctl status mytest.service

Sie sollten eine Ausgabe erhalten, die angibt, dass der Dienst aktiv (läuft) ist:

● mytest.service - Mein Testdienst
     Geladen: geladen (/home/labex/project/mytest.service; statisch)
     Aktiv: aktiv (läuft) seit ...
   Haupt-PID: ... (bash)
      Aufgaben: 2 (Limit: ...)
     Speicher: ...
        CPU: ...
     CGroup: /system.slice/system-mytest.service
             └─... /bin/bash -c while true; do echo "$(date): Mein Testdienst läuft." >> /tmp/mytest.log; sleep 5; done

...Ausgabe ausgelassen...

Sie können auch die Protokolldatei überprüfen, um zu sehen, ob der Dienst Nachrichten schreibt:

tail -f /tmp/mytest.log

Sie sollten alle 5 Sekunden neue Zeilen sehen. Drücken Sie Strg+C, um tail zu beenden.

Stoppen eines Dienstes

Um einen laufenden Dienst zu stoppen, verwenden Sie den Befehl systemctl stop.

Führen Sie den folgenden Befehl aus, um mytest.service zu stoppen:

sudo systemctl stop mytest.service

Auch hier gibt es keine sofortige Ausgabe.

Überprüfen Sie, ob der Dienst gestoppt wurde:

systemctl status mytest.service

Die Ausgabe sollte nun Aktiv: inaktiv (tot) anzeigen:

● mytest.service - Mein Testdienst
     Geladen: geladen (/home/labex/project/mytest.service; statisch)
     Aktiv: inaktiv (tot) seit ...
...Ausgabe ausgelassen...

Überprüfen Sie erneut die Protokolldatei /tmp/mytest.log. Sie sollten die Nachricht "Mein Testdienst gestoppt." sehen und keine neuen "läuft"-Nachrichten mehr erscheinen.

tail /tmp/mytest.log

Neustarten eines Dienstes

Um einen Dienst neu zu starten, verwenden Sie den Befehl systemctl restart. Dieser Befehl stoppt den Dienst zuerst und startet ihn dann erneut. Dies ist nützlich, wenn Sie Änderungen an der Konfiguration eines Dienstes vorgenommen haben und diese wirksam werden sollen.

Führen Sie den folgenden Befehl aus, um mytest.service neu zu starten:

sudo systemctl restart mytest.service

Überprüfen Sie, ob der Dienst wieder läuft:

systemctl status mytest.service

Sie sollten wieder Aktiv: aktiv (läuft) sehen, und die Haupt-PID wird wahrscheinlich eine neue Zahl sein, was auf einen neuen Prozess hinweist.

● mytest.service - Mein Testdienst
     Geladen: geladen (/home/labex/project/mytest.service; statisch)
     Aktiv: aktiv (läuft) seit ...
   Haupt-PID: ... (bash)
...Ausgabe ausgelassen...

Überprüfen Sie die Protokolldatei /tmp/mytest.log, um zu bestätigen, dass der Dienst wieder mit der Aufzeichnung von "läuft"-Nachrichten begonnen hat.

tail -f /tmp/mytest.log

Drücken Sie Strg+C, um tail zu beenden.

Zum Schluss bereinigen wir die mytest.log-Datei für die nächsten Schritte.

rm /tmp/mytest.log

Dienstkonfiguration mit systemctl neu laden

In diesem Schritt lernen Sie das Neuladen von Dienstkonfigurationen. Einige Dienste können Änderungen an ihren Konfigurationsdateien vornehmen, ohne einen vollständigen Neustart zu benötigen. Dies wird als "Neu laden" des Dienstes bezeichnet. Das Neu laden wird im Allgemeinen dem Neustart vorgezogen, da es Ausfallzeiten des Dienstes vermeidet und bestehende Verbindungen oder Zustände beibehält. Wenn ein Dienst neu geladen wird, bleibt seine Prozess-ID (PID) typischerweise gleich, im Gegensatz zu einem vollständigen Neustart, bei dem sich die PID ändert.

Wir verwenden weiterhin unseren Dienst mytest.service aus dem vorherigen Schritt. Wir werden sein Verhalten ändern und ihn dann neu laden, um zu sehen, dass die Änderungen wirksam werden, ohne den Dienst anzuhalten und zu starten.

Stellen Sie zunächst sicher, dass mytest.service läuft. Falls nicht, starten Sie ihn:

sudo systemctl start mytest.service

Überprüfen Sie seinen Status:

systemctl status mytest.service

Notieren Sie sich die Haupt-PID von mytest.service.

Ändern wir nun die Datei mytest.service, um die protokollierte Nachricht und den Intervall zu ändern. Wir werden die Protokollnachricht und die sleep-Dauer ändern.

Öffnen Sie /etc/systemd/system/mytest.service mit nano:

sudo nano /etc/systemd/system/mytest.service

Ändern Sie die Zeile ExecStart wie folgt, indem Sie die Nachricht und die sleep-Zeit von 5 auf 2 Sekunden ändern:

[Unit]
Description=Mein Testdienst
After=network.target

[Service]
Type=simple
ExecStart=/bin/bash -c 'while true; do echo "$(date): Mein Testdienst (neu geladen) läuft." >> /tmp/mytest.log; sleep 2; done'
ExecStop=/bin/bash -c 'echo "$(date): Mein Testdienst gestoppt." >> /tmp/mytest.log'
Restart=on-failure

[Install]
WantedBy=multi-user.target

Speichern Sie die Datei, indem Sie Strg+X, dann Y und Eingabe drücken.

Anstatt neu zu starten, laden wir den Dienst nun neu. Nicht alle Dienste unterstützen das Neu laden. Für Dienste, die dies tun, sendet systemctl reload ein Signal (oft SIGHUP) an den Dienstprozess, um ihn aufzufordern, seine Konfigurationsdateien erneut zu lesen.

Laden Sie nach der Änderung der Dienstdatei die systemd-Konfiguration neu:

sudo systemctl daemon-reload

Führen Sie den Befehl zum Neu laden aus:

sudo systemctl reload mytest.service

Es wird keine sofortige Ausgabe geben, wenn der Befehl erfolgreich ist.

Überprüfen Sie nun erneut den Status des Dienstes:

systemctl status mytest.service

Beachten Sie die Haupt-PID. Sie sollte die gleiche wie vor dem Neu laden sein, was darauf hinweist, dass der Dienstprozess selbst nicht beendet und neu gestartet wurde.

● mytest.service - Mein Testdienst
     Geladen: geladen (/etc/systemd/system/mytest.service; statisch)
     Aktiv: aktiv (läuft) seit ...
   Haupt-PID: ... (bash)  <-- Diese PID sollte gleich wie vor dem Neu laden sein
...Ausgabe ausgelassen...

Überprüfen Sie abschließend die Datei /tmp/mytest.log, um zu sehen, ob die Änderungen wirksam geworden sind.

tail -f /tmp/mytest.log

Sie sollten nun die neue Nachricht "Mein Testdienst (neu geladen) läuft." alle 2 Sekunden sehen, was bestätigt, dass der Dienst seine Konfiguration ohne vollständigen Neustart neu geladen hat.

Drücken Sie Strg+C, um tail zu beenden.

reload-or-restart-Option

Was ist, wenn Sie nicht sicher sind, ob ein Dienst das Neu laden unterstützt? systemctl bietet eine praktische Option: reload-or-restart. Dieser Befehl versucht, den Dienst neu zu laden, wenn dies unterstützt wird. Wenn das Neu laden nicht unterstützt wird, führt er stattdessen einen vollständigen Neustart durch. Dies ist eine sichere Methode, um Konfigurationsänderungen anzuwenden.

Demonstrieren wir dies. Stoppen Sie zunächst mytest.service, um das Protokoll für einen frischen Start zu leeren:

sudo systemctl stop mytest.service
rm /tmp/mytest.log

Starten Sie ihn nun erneut:

sudo systemctl start mytest.service

Ändern Sie die Datei mytest.service noch einmal. Ändern Sie die Nachricht wieder auf die ursprüngliche und die sleep-Zeit auf 3 Sekunden.

sudo nano /etc/systemd/system/mytest.service

Ändern Sie ExecStart auf:

ExecStart=/bin/bash -c 'while true; do echo "$(date): Mein Testdienst (original) läuft." >> /tmp/mytest.log; sleep 3; done'

Speichern Sie die Datei.

Laden Sie die systemd-Konfiguration neu und verwenden Sie dann reload-or-restart:

sudo systemctl daemon-reload
sudo systemctl reload-or-restart mytest.service

Überprüfen Sie die Protokolldatei:

tail -f /tmp/mytest.log

Sie sollten "Mein Testdienst (original) läuft." alle 3 Sekunden sehen. Da unser mytest.service für Neu ladungen ausgelegt ist (indem einfach der ExecStart-Befehl erneut ausgeführt wird, was ein gängiges Muster für einfache Skripte ist), hätte reload-or-restart ein Neu laden durchgeführt. Wenn es dies nicht unterstützt hätte, hätte es einen Neustart durchgeführt.

Drücken Sie Strg+C, um tail zu beenden.

Zum Schluss stoppen Sie den Dienst und bereinigen Sie die Protokolldatei:

sudo systemctl stop mytest.service
rm /tmp/mytest.log

Dienste beim Booten aktivieren und deaktivieren mit systemctl

In diesem Schritt lernen Sie, wie Sie Dienste konfigurieren, damit sie beim Systemstart automatisch starten (aktivieren) oder verhindert werden, dass sie beim Booten starten (deaktivieren). Dies ist entscheidend für die Verwaltung von Systemressourcen und die Sicherstellung, dass notwendige Dienste verfügbar sind, wenn das System startet.

In einer typischen systemd-Umgebung erstellt die Aktivierung eines Dienstes symbolische Links in den entsprechenden systemd-Konfigurationsverzeichnissen (z. B. /etc/systemd/system/multi-user.target.wants/), die auf die Unit-Datei des Dienstes verweisen. Die Deaktivierung eines Dienstes entfernt diese Links.

Da wir uns in einer containerisierten Umgebung befinden, in der systemd möglicherweise nicht im traditionellen Sinne vollständig funktionsfähig ist, erstellen die Befehle enable und disable möglicherweise keine tatsächlichen Symlinks im Verzeichnis /etc/systemd/system, die über Containerneustarts hinweg bestehen bleiben. systemctl verarbeitet diese Befehle jedoch weiterhin und aktualisiert seinen internen Zustand, was wir beobachten werden.

Wir verwenden weiterhin unseren Dienst mytest.service für diese Demonstration.

Stellen Sie zunächst sicher, dass mytest.service aus dem vorherigen Schritt gestoppt ist:

sudo systemctl stop mytest.service

Aktivieren eines Dienstes

Um einen Dienst zu aktivieren, verwenden Sie den Befehl systemctl enable. Dieser Befehl konfiguriert den Dienst, so dass er automatisch startet, wenn das System hochfährt.

Führen Sie den folgenden Befehl aus, um mytest.service zu aktivieren:

sudo systemctl enable mytest.service

Möglicherweise sehen Sie eine Ausgabe ähnlich dieser, die darauf hinweist, dass in einer vollständigen systemd-Umgebung ein symbolischer Link erstellt würde:

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

Überprüfen Sie nun, ob der Dienst mit systemctl is-enabled aktiviert ist:

systemctl is-enabled mytest.service

Erwartete Ausgabe:

enabled

Dies bestätigt, dass systemctl nun mytest.service als für den Start aktiviert betrachtet.

Sie können das Aktivieren und Starten eines Dienstes auch in einem Befehl mit der Option --now kombinieren. Dies ist eine bequeme Möglichkeit, sicherzustellen, dass ein Dienst sowohl sofort läuft als auch für zukünftige Starts konfiguriert ist.

Lassen Sie uns ihn zunächst deaktivieren, um die Demonstration mit --now vorzubereiten:

sudo systemctl disable mytest.service

Aktivieren und starten Sie ihn nun gleichzeitig:

sudo systemctl enable --now mytest.service

Überprüfen Sie seinen Status und seine Aktivierung:

systemctl status mytest.service
systemctl is-enabled mytest.service

Sie sollten aus dem Befehl status "Aktiv: aktiv (läuft)" und aus dem Befehl is-enabled "aktiviert" sehen.

Deaktivieren eines Dienstes

Um einen Dienst zu deaktivieren, verwenden Sie den Befehl systemctl disable. Dieser Befehl entfernt die Konfiguration, die den Dienst veranlasst, beim Systemstart zu starten.

Führen Sie den folgenden Befehl aus, um mytest.service zu deaktivieren:

sudo systemctl disable mytest.service

Möglicherweise sehen Sie eine Ausgabe, die die Entfernung des symbolischen Links anzeigt:

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

Überprüfen Sie nun, ob der Dienst deaktiviert ist:

systemctl is-enabled mytest.service

Erwartete Ausgabe:

disabled

Ähnlich wie beim Aktivieren können Sie das Deaktivieren und Stoppen eines Dienstes mit der Option --now kombinieren. Dies stoppt den Dienst sofort und verhindert, dass er bei zukünftigen Starts startet.

sudo systemctl disable --now mytest.service

Überprüfen Sie seinen Status und seine Aktivierung:

systemctl status mytest.service
systemctl is-enabled mytest.service

Sie sollten aus dem Befehl status "Aktiv: inaktiv (tot)" und aus dem Befehl is-enabled "deaktiviert" sehen.

Dies schließt die Demonstration des Aktivieren und Deaktivieren von Diensten ab. Denken Sie daran, dass diese Befehle in einer echten systemd-Umgebung die Bootkonfiguration direkt manipulieren.

Dienste mit systemctl maskieren und entmaskieren

In diesem letzten Schritt lernen Sie das Maskieren und Entmaskieren von Diensten. Das Maskieren eines Dienstes ist eine effektive Methode, um zu verhindern, dass er manuell oder beim Booten automatisch gestartet wird. Es erstellt einen symbolischen Link von der Dienst-Unit-Datei zu /dev/null, wodurch der Dienst für systemd effektiv unzugänglich wird. Dies wird häufig für Dienste verwendet, die mit anderen Diensten in Konflikt stehen oder auf einem bestimmten System niemals ausgeführt werden sollen.

Wir verwenden weiterhin unseren Dienst mytest.service für diese Demonstration.

Stellen Sie zunächst sicher, dass mytest.service aus dem vorherigen Schritt gestoppt und deaktiviert ist:

sudo systemctl stop mytest.service
sudo systemctl disable mytest.service

Einen Dienst maskieren

Um einen Dienst zu maskieren, verwenden Sie den Befehl systemctl mask.

Führen Sie den folgenden Befehl aus, um mytest.service zu maskieren:

sudo systemctl mask mytest.service

Sie sehen eine Ausgabe, die die Erstellung eines symbolischen Links zu /dev/null anzeigt:

Created symlink /etc/systemd/system/mytest.service → /dev/null.

Versuchen Sie nun, den maskierten Dienst zu starten:

sudo systemctl start mytest.service

Sie erhalten eine Fehlermeldung, die darauf hinweist, dass der Dienst maskiert ist:

Failed to start mytest.service: Unit mytest.service is masked.

Sie können auch den Status des Dienstes mit systemctl list-unit-files überprüfen:

systemctl list-unit-files --type=service | grep mytest.service

Die Ausgabe sollte für mytest.service masked anzeigen:

mytest.service                            masked      disabled

Dies bestätigt, dass der Dienst nun maskiert ist und nicht gestartet werden kann.

Einen Dienst entmaskieren

Um einen Dienst zu entmaskieren, verwenden Sie den Befehl systemctl unmask. Dieser Befehl entfernt den symbolischen Link zu /dev/null und macht den Dienst wieder verfügbar.

Führen Sie den folgenden Befehl aus, um mytest.service zu entmaskieren:

sudo systemctl unmask mytest.service

Sie sehen eine Ausgabe, die die Entfernung des symbolischen Links anzeigt:

Removed /etc/systemd/system/mytest.service.

Versuchen Sie nun, den Dienst erneut zu starten:

sudo systemctl start mytest.service

Diesmal sollte der Dienst erfolgreich ohne Fehler starten.

Überprüfen Sie seinen Status:

systemctl status mytest.service

Sie sollten Aktiv: aktiv (läuft) sehen:

● mytest.service - My Test Service
     Geladen: geladen (/etc/systemd/system/mytest.service; statisch)
     Aktiv: aktiv (läuft) seit ...
...Ausgabe ausgelassen...

Überprüfen Sie abschließend den Status des Dienstes erneut mit systemctl list-unit-files:

systemctl list-unit-files --type=service | grep mytest.service

Die Ausgabe sollte nun static für mytest.service anzeigen (da er nicht in einem Standard-systemd-Pfad installiert ist, aber jetzt entmaskiert ist):

mytest.service                            static      disabled

Dies schließt das Labor zum Steuern von Diensten und Dämonen ab. Sie haben gelernt, wie Sie Dienste mit systemctl anzeigen, starten, stoppen, neu starten, neu laden, aktivieren, deaktivieren, maskieren und entmaskieren.

Bevor Sie fortfahren, stoppen Sie den Dienst mytest.service und entfernen Sie die Dienstdatei und die Protokolldatei, um Ihre Umgebung zu bereinigen:

sudo systemctl stop mytest.service
sudo rm /etc/systemd/system/mytest.service
rm /tmp/mytest.log

Zusammenfassung

In diesem Labor haben wir praktische Erfahrungen mit der Verwaltung von Steuerungssystemdiensten mithilfe des Befehls systemctl gesammelt, selbst innerhalb einer containerisierten Umgebung, in der systemd möglicherweise nicht das primäre Init-System ist. Wir haben gelernt, wie man alle geladenen und aktiven Dienst-Units mit systemctl list-units --type=service auflistet und die Spalten UNIT, LOAD, ACTIVE und SUB versteht, um den Dienststatus zu interpretieren.

Darüber hinaus haben wir grundlegende Dienstverwaltungsoperationen erkundet: den Status eines bestimmten Dienstes mit systemctl status überprüfen und den Dienstlebenszyklus durch Starten, Stoppen und Neustarten von Diensten steuern. Wir haben auch gelernt, wie man Dienstkonfigurationen neu lädt, Dienste aktiviert und deaktiviert, um ihr Verhalten beim Booten zu steuern, und die fortgeschrittenen Konzepte des Maskierens und Entmaskierens von Diensten, um zu verhindern, dass sie gestartet werden. Diese umfassenden Fähigkeiten bilden eine solide Grundlage für die Verwaltung von Diensten auf Linux-Systemen.