Dienste in Red Hat Enterprise Linux steuern

Red Hat Enterprise LinuxBeginner
Jetzt üben

Einführung

In diesem Lab sammeln Sie praktische Erfahrungen im Management von Systemdiensten unter RHEL mit dem Befehl systemctl. Sie lernen, alle geladenen und aktiven Dienste anzuzeigen, den Status spezifischer Dienste zu überprüfen und deren Laufzeitverhalten durch Starten, Stoppen und Neustarten zu steuern. Darüber hinaus erfahren Sie, wie Sie Dienstkonfigurationen neu laden, Dienste für den automatischen Start beim Booten aktivieren oder deaktivieren und verstehen die fortgeschrittenen Konzepte des Maskierens und Entmaskierens von Diensten, um deren Aktivierung zu verhindern.

Diese praktische Anleitung vermittelt Ihnen wesentliche Fähigkeiten für die Systemadministration, die es Ihnen ermöglichen, den Lebenszyklus von Diensten, die für den Betrieb Ihres RHEL-Systems entscheidend sind, effektiv zu überwachen und zu verwalten.

Alle geladenen und aktiven Dienste mit systemctl anzeigen

In diesem Schritt lernen Sie, wie Sie automatisch gestartete Systemprozesse mit dem Befehl systemctl identifizieren. systemctl ist das primäre Werkzeug zur Verwaltung von systemd-Diensten in Red Hat Enterprise Linux.

Zuerst untersuchen wir, wie alle aktuell geladenen und aktiven Service-Units aufgelistet werden. Der Befehl systemctl list-units --type=service wird zu diesem Zweck verwendet. Dieser Befehl zeigt Service-Units an, die der systemd-Daemon erfolgreich geparst und in den Speicher geladen hat und die derzeit aktiv sind.

Öffnen Sie Ihr Terminal in der RHEL-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 Service-Units aufzulisten:

systemctl list-units --type=service

Sie sehen eine Ausgabe ähnlich dieser, die verschiedene Dienste und ihre Zustände anzeigt:

UNIT                  LOAD    ACTIVE  SUB      DESCRIPTION
atd.service           loaded  active  running  Job spooling tools
auditd.service        loaded  active  running  Security Auditing Service
chronyd.service       loaded  active  running  NTP client/server
crond.service         loaded  active  running  Command Scheduler
dbus-broker.service   loaded  active  running  D-Bus System Message Bus
...output omitted...

Lassen Sie uns die Spalten in der Ausgabe aufschlüsseln:

  • UNIT: Dies ist der Name der Service-Unit, der normalerweise mit .service endet.
  • LOAD: Zeigt an, ob der systemd-Daemon die Konfiguration der Unit erfolgreich geparst und in den Speicher geladen hat. loaded bedeutet, dass dies erfolgreich war.
  • ACTIVE: Dies ist der übergeordnete Aktivierungszustand der Unit. active bedeutet im Allgemeinen, dass die Unit erfolgreich gestartet wurde.
  • SUB: Dies ist der untergeordnete Aktivierungszustand, der detailliertere Informationen liefert. Bei laufenden Diensten ist running üblich.
  • DESCRIPTION: Eine kurze Beschreibung dessen, was der Dienst tut.

Drücken Sie q, um den Befehl zu beenden.

Als Nächstes können Sie die Option --all mit systemctl list-units --type=service verwenden, um alle Service-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 inactive oder in anderen Zuständen sind, und bietet eine umfassendere Ansicht:

UNIT                          LOAD      ACTIVE   SUB     DESCRIPTION
  atd.service                 loaded    active   running Job spooling tools
  auditd.service              loaded    active   running Security Auditing ...
  auth-rpcgss-module.service  loaded    inactive dead    Kernel Module ...
  chronyd.service             loaded    active   running NTP client/server
  cpupower.service            loaded    inactive dead    Configure CPU power ...
  crond.service               loaded    active   running Command Scheduler
  dbus-broker.service         loaded    active   running  D-Bus System Message Bus
● display-manager.service     not-found inactive dead    display-manager.service
...output omitted...

Schließlich können Sie mit systemctl list-unit-files --type=service den Zustand aller installierten Unit-Dateien anzeigen, einschließlich derer, die nicht geladen oder aktiv sind. Dieser Befehl zeigt an, ob ein Dienst enabled (wird beim Booten gestartet), disabled (wird nicht beim Booten gestartet), static (kann nicht direkt aktiviert werden, wird aber möglicherweise von einer anderen Unit gestartet) oder masked (kann nicht gestartet werden) ist.

Führen Sie den folgenden Befehl aus:

systemctl list-unit-files --type=service

Sie sehen eine Ausgabe ähnlich dieser, die den STATE und VENDOR PRESET für jede Service-Unit-Datei angibt:

UNIT FILE                         STATE       VENDOR PRESET
arp-ethers.service                disabled    disabled
atd.service                       enabled     enabled
auditd.service                    enabled     enabled
auth-rpcgss-module.service        static      -
autovt@.service                   alias       -
blk-availability.service          disabled    disabled
...output omitted...

Dieser Befehl ist besonders nützlich, um zu verstehen, welche Dienste so konfiguriert sind, dass sie beim Systemstart automatisch gestartet werden.

Status eines bestimmten Dienstes mit systemctl status prüfen

In diesem Schritt lernen Sie, wie Sie den detaillierten Status eines bestimmten Dienstes mit dem Befehl systemctl status überprüfen. Dieser Befehl liefert umfassende Informationen über einen Dienst, einschließlich ob er läuft, seine Prozess-ID, Speichernutzung und aktuelle Protokolleinträge.

Wir verwenden crond.service (cron-Daemon) als Beispiel. Der Cron-Daemon ist ein gängiger Dienst, der geplante Aufgaben verwaltet.

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

Führen Sie den folgenden Befehl aus, um den Status von crond.service zu überprüfen:

systemctl status crond.service

Sie sehen eine detaillierte Ausgabe ähnlich dieser:

● crond.service - Command Scheduler
     Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; preset: enabled)
     Active: active (running) since Mon 2022-03-14 05:38:10 EDT; 25min ago
   Main PID: 1089 (crond)
      Tasks: 1 (limit: 35578)
     Memory: 1.2M
        CPU: 12ms
     CGroup: /system.slice/crond.service
             └─1089 /usr/sbin/crond -n

Mar 14 05:38:10 workstation systemd[1]: Started Command Scheduler.
Warning: some journal files were not opened due to insufficient permissions.

Lassen Sie uns die wichtigsten Felder in der Ausgabe untersuchen:

  • Loaded: Diese Zeile gibt an, ob die Konfigurationsdatei der Service-Unit verarbeitet wurde. Sie zeigt auch den Pfad zur Unit-Datei (/usr/lib/systemd/system/crond.service) und ihren Aktivierungsstatus (enabled bedeutet, dass sie für den Start beim Booten konfiguriert ist).
  • Active: Dies ist entscheidend. Es zeigt den aktuellen Zustand des Dienstes an. active (running) bedeutet, dass der Dienst derzeit aktiv ist und seine Prozesse laufen. Es zeigt auch an, wie lange er bereits aktiv ist. Andere Zustände können inactive (nicht laufend), active (exited) (eine einmalige Aufgabe abgeschlossen) oder failed (ein Fehler ist aufgetreten) sein.
  • Main PID: Die Prozess-ID (PID) des Hauptprozesses, der mit dem Dienst verbunden ist, zusammen mit dem Befehlsnamen.
  • Tasks: Die Anzahl der Aufgaben (Threads), die der Dienst derzeit verwendet.
  • Memory: Die vom Dienst verbrauchte Speichermenge.
  • CPU: Die vom Dienst verbrauchte CPU-Zeit.
  • CGroup: Informationen über die Control Group (CGroup), zu der der Dienst gehört und die für die Ressourcenverwaltung verwendet wird.
  • Die Zeilen unter CGroup zeigen aktuelle Protokolleinträge, die sich auf den Dienst beziehen und Einblicke in seinen Start und seine laufenden Aktivitäten geben.

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

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

    systemctl is-active crond.service

    Erwartete Ausgabe:

    active
  • Um zu überprüfen, ob ein Dienst aktiviert ist (konfiguriert für den Start beim Booten):

    systemctl is-enabled crond.service

    Erwartete Ausgabe:

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

    systemctl is-failed crond.service

    Erwartete Ausgabe (wenn er korrekt läuft):

    active

    Wenn ein Dienst Probleme beim Starten oder Ausführen hatte, würde dieser Befehl failed zurückgeben.

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

Dienst mit systemctl starten, stoppen und neu starten

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

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

Erstellen Sie eine neue Service-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=My Test Service
After=network.target

[Service]
Type=simple
ExecStart=/bin/bash -c 'while true; do echo "$(date): My Test Service is running." >> /tmp/mytest.log; sleep 5; done'
ExecStop=/bin/bash -c 'echo "$(date): My Test Service stopped." >> /tmp/mytest.log'
Restart=on-failure

[Install]
WantedBy=multi-user.target
  • [Unit]: Enthält allgemeine Informationen über die Unit. Description liefert einen menschenlesbaren Namen, und After=network.target gibt an, dass dieser Dienst nach dem Hochfahren des Netzwerks gestartet werden soll.
  • [Service]: Definiert das Verhalten des Dienstes.
    • Type=simple: Zeigt einen einfachen Diensttyp an, bei dem der ExecStart-Befehl der Hauptprozess ist.
    • ExecStart: Der Befehl, der ausgeführt wird, wenn der Dienst gestartet wird. Hierbei handelt es sich um eine Bash-Schleife, die alle 5 Sekunden eine zeitgestempelte Nachricht in /tmp/mytest.log schreibt.
    • ExecStop: Der Befehl, der ausgeführt wird, wenn der Dienst gestoppt wird. Er schreibt eine Stopp-Nachricht in das Protokoll.
    • Restart=on-failure: Konfiguriert den Dienst so, dass er neu gestartet wird, wenn er mit einem Status ungleich Null 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 Ctrl+X drücken, dann Y zur Bestätigung und Enter, um die Datei zu speichern.

Laden Sie nun den systemd-Daemon neu, damit er den neuen Dienst erkennt:

sudo systemctl daemon-reload

Dienst starten

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 in der Regel Root-Privilegien erfordern.

sudo systemctl start mytest.service

Wenn der Befehl erfolgreich war, gibt es keine sofortige Ausgabe.

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

systemctl status mytest.service

Sie sollten eine Ausgabe sehen, die anzeigt, dass der Dienst active (running) ist:

● mytest.service - My Test Service
     Loaded: loaded (/etc/systemd/system/mytest.service; disabled; preset: disabled)
     Active: active (running) since ...
   Main PID: ... (bash)
      Tasks: 2 (limit: ...)
     Memory: ...
        CPU: ...
     CGroup: /system.slice/mytest.service
             ├─... /bin/bash -c "while true; do echo \"\$(date): My Test Service is running.\" >> /tmp/mytest.log; sleep 5; done"
             └─... sleep 5

...output omitted...

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, ähnlich wie diese:

Tue Jul 22 09:15:09 AM CST 2025: My Test Service is running.
Tue Jul 22 09:15:14 AM CST 2025: My Test Service is running.

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

Dienst stoppen

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 Active: inactive (dead) anzeigen:

○ mytest.service - My Test Service
     Loaded: loaded (/etc/systemd/system/mytest.service; disabled; preset: disabled)
     Active: inactive (dead) since ...
...output omitted...

Überprüfen Sie die Protokolldatei /tmp/mytest.log erneut. Sie sollten die Meldung "My Test Service stopped." sehen und keine neuen "running"-Meldungen mehr erscheinen.

tail /tmp/mytest.log

Die Ausgabe wird ähnlich wie folgt aussehen:

Tue Jul 22 09:15:24 AM CST 2025: My Test Service is running.
Tue Jul 22 09:15:28 AM CST 2025: My Test Service stopped.

Dienst neu starten

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

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 Active: active (running) sehen, und die Main PID wird wahrscheinlich eine neue Nummer sein, was darauf hinweist, dass ein neuer Prozess gestartet wurde.

● mytest.service - My Test Service
     Loaded: loaded (/etc/systemd/system/mytest.service; disabled; preset: disabled)
     Active: active (running) since ...
   Main PID: ... (bash)
      Tasks: 2 (limit: ...)
     Memory: ...
        CPU: ...
     CGroup: /system.slice/mytest.service
             ├─... /bin/bash -c "while true; do echo \"\$(date): My Test Service is running.\" >> /tmp/mytest.log; sleep 5; done"
             └─... sleep 5
...output omitted...

Überprüfen Sie die Protokolldatei /tmp/mytest.log, um sicherzustellen, dass der Dienst mit dem Schreiben von "running"-Meldungen fortgefahren ist.

tail -f /tmp/mytest.log

Sie sollten eine "stopped"-Meldung gefolgt von neuen "running"-Meldungen sehen:

Tue Jul 22 09:15:28 AM CST 2025: My Test Service stopped.
Tue Jul 22 09:15:40 AM CST 2025: My Test Service is running.

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

Anwenden von Konfigurationsänderungen auf einen Dienst

In diesem Schritt lernen Sie das Neuladen von Dienstkonfigurationen kennen. Einige Dienste können Änderungen an ihren Konfigurationsdateien anwenden, ohne einen vollständigen Neustart zu benötigen. Dies wird als "Neuladen" (reloading) des Dienstes bezeichnet. Das Neuladen wird im Allgemeinen dem Neustarten 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 werden unseren mytest.service aus dem vorherigen Schritt weiter verwenden. Wir werden sein Verhalten ändern und dann versuchen, es neu zu laden, um zu sehen, was passiert.

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

sudo systemctl start mytest.service

Überprüfen Sie seinen Status und notieren Sie sich seine Main PID:

systemctl status mytest.service

Nun ändern wir die Datei mytest.service, um die Nachricht, die sie protokolliert, und das Intervall zu ändern. Wir ändern die Protokollnachricht und die sleep-Dauer.

Ö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=My Test Service
After=network.target

[Service]
Type=simple
ExecStart=/bin/bash -c 'while true; do echo "$(date): My Test Service (reloaded) is running." >> /tmp/mytest.log; sleep 2; done'
ExecStop=/bin/bash -c 'echo "$(date): My Test Service stopped." >> /tmp/mytest.log'
Restart=on-failure

[Install]
WantedBy=multi-user.target

Speichern Sie die Datei, indem Sie Ctrl+X, dann Y und Enter drücken.

Nachdem Sie die Änderungen gespeichert haben, müssen Sie systemd informieren, dass sich die Konfiguration des Dienstes geändert hat.

sudo systemctl daemon-reload

Versuchen wir nun, den Dienst neu zu laden, um die Änderungen anzuwenden:

sudo systemctl reload mytest.service

Sie werden wahrscheinlich auf einen Fehler stoßen:

Failed to reload mytest.service: Job type reload is not applicable for unit mytest.service.

Dieser Fehler tritt auf, weil unser einfacher Dienst nicht dafür konfiguriert ist, eine Neuladeanforderung zu verarbeiten. Damit ein Dienst neu geladen werden kann, muss seine Unit-Datei eine ExecReload-Direktive enthalten, die den Befehl angibt, der zum Neuladen der Konfiguration ausgeführt werden soll. Da unser mytest.service diese nicht hat, weiß systemd nicht, wie es ihn neu laden soll.

In solchen Situationen bietet systemd einen praktischen Befehl: reload-or-restart. Dieser Befehl versucht, den Dienst neu zu laden, aber wenn das Neuladen nicht unterstützt wird, greift er auf einen Neustart des Dienstes zurück. Dies ist oft eine sicherere und effektivere Methode, um Konfigurationsänderungen anzuwenden.

Verwenden wir nun reload-or-restart:

sudo systemctl reload-or-restart mytest.service

Dieser Befehl sollte erfolgreich sein. Überprüfen Sie nun erneut den Status des Dienstes:

systemctl status mytest.service

Beachten Sie die Main PID. Da unser Dienst neu gestartet wurde (weil er nicht neu geladen werden konnte), werden Sie feststellen, dass die Main PID eine neue Nummer ist. Dies bestätigt, dass der alte Prozess gestoppt und ein neuer mit der aktualisierten Konfiguration gestartet wurde.

Schließlich überprüfen wir die Datei /tmp/mytest.log, um zu sehen, ob die Änderungen wirksam geworden sind.

tail -f /tmp/mytest.log

Sie sollten die neue Protokollnachricht "My Test Service (reloaded) is running." sehen, die alle 2 Sekunden erscheint. Drücken Sie Ctrl+C, um tail zu beenden.

Dienste beim Booten mit systemctl aktivieren und deaktivieren

In diesem Schritt lernen Sie, wie Sie Dienste so konfigurieren, dass sie beim Systemstart automatisch gestartet werden (aktivieren) oder verhindern, dass sie beim Systemstart gestartet werden (deaktivieren). Dies ist entscheidend für die Verwaltung von Systemressourcen und stellt sicher, dass notwendige Dienste beim Systemstart verfügbar sind.

In einer typischen systemd-Umgebung erstellt das Aktivieren 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. Das Deaktivieren eines Dienstes entfernt diese Links.

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

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

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

sudo systemctl stop mytest.service

Dienst aktivieren

Um einen Dienst zu aktivieren, verwenden Sie den Befehl systemctl enable. Dieser Befehl konfiguriert den Dienst so, dass er beim Systemstart automatisch gestartet wird.

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

sudo systemctl enable mytest.service

Sie sehen möglicherweise eine Ausgabe, die der folgenden ähnelt und anzeigt, 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 mit systemctl is-enabled, ob der Dienst aktiviert ist:

systemctl is-enabled mytest.service

Erwartete Ausgabe:

enabled

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

Sie können das Aktivieren und Starten eines Dienstes auch mit einer einzigen Befehlszeile mit der Option --now kombinieren. Dies ist eine praktische Möglichkeit, sicherzustellen, dass ein Dienst sofort läuft und für den Start bei zukünftigen Systemstarts konfiguriert ist.

Deaktivieren wir ihn zunächst, um uns auf die --now-Demonstration 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 vom status-Befehl Active: active (running) und vom is-enabled-Befehl enabled sehen.

Dienst deaktivieren

Um einen Dienst zu deaktivieren, verwenden Sie den Befehl systemctl disable. Dieser Befehl entfernt die Konfiguration, die dazu führt, dass der Dienst beim Systemstart gestartet wird.

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

sudo systemctl disable mytest.service

Sie sehen möglicherweise 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 Systemstarts gestartet wird.

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 vom status-Befehl Active: inactive (dead) und vom is-enabled-Befehl disabled sehen.

Damit ist die Demonstration des Aktivierens und Deaktivierens von Diensten abgeschlossen. Denken Sie daran, dass diese Befehle in einer realen systemd-Umgebung direkt die Boot-Konfiguration manipulieren.

Dienste mit systemctl maskieren und entmaskieren

In diesem letzten Schritt lernen Sie das Maskieren und Entmaskieren von Diensten kennen. Das Maskieren eines Dienstes ist eine leistungsstarke Methode, um zu verhindern, dass er manuell oder automatisch beim Systemstart gestartet wird.

Wenn Sie einen Dienst maskieren, erstellt systemd einen symbolischen Link von /etc/systemd/system/<service-name>.service nach /dev/null, wodurch die Unit-Datei des Dienstes für systemd effektiv unzugänglich gemacht wird. Dies ist eine stärkere Alternative zu disable.

Dieser Mechanismus funktioniert am besten für Dienste, die in /usr/lib/systemd/system definiert sind, wo Pakete ihre Service-Dateien installieren. Der Befehl mask erstellt eine überschreibende "leere" Datei in /etc/systemd/system. Wie Sie jedoch festgestellt haben, kann der Befehl fehlschlagen, wenn Sie versuchen, einen Dienst zu maskieren, den Sie direkt in /etc/systemd/system erstellt haben (wie unseren mytest.service), da er so konzipiert ist, dass er keine vorhandene Konfigurationsdatei überschreibt, was zu Datenverlust führen würde.

Um das Maskieren korrekt zu demonstrieren, verwenden wir einen bereits vorhandenen Dienst, atd.service.

Überprüfen wir zunächst den aktuellen Status von atd.service. Er sollte aktiv und aktiviert sein.

systemctl status atd.service

Die Ausgabe wird ähnlich wie folgt aussehen und zeigen, dass der Dienst aktiv und läuft:

● atd.service - Deferred execution scheduler
     Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; preset: enabled)
     Active: active (running) since Tue 2025-07-22 09:13:06 CST; 22min ago
       Docs: man:atd(8)
   Main PID: 1222 (atd)
      Tasks: 1 (limit: 22509)
     Memory: 900.0K
        CPU: 5ms
     CGroup: /system.slice/atd.service
             └─1222 /usr/sbin/atd -f

Dienst maskieren

Es ist eine gute Praxis, einen Dienst zu stoppen, bevor er maskiert wird.

sudo systemctl stop atd.service

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

sudo systemctl mask atd.service

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

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

Versuchen Sie nun, den maskierten Dienst zu starten:

sudo systemctl start atd.service

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

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

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

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

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

atd.service                            masked      enabled

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

Dienst entmaskieren

Um einen Dienst zu entmaskieren, verwenden Sie den Befehl systemctl unmask. Dieser Befehl entfernt den symbolischen Link nach /dev/null und stellt die ursprüngliche Service-Datei aus /usr/lib/systemd/system wieder her.

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

sudo systemctl unmask atd.service

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

Removed "/etc/systemd/system/atd.service".

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

systemctl status atd.service

Sie sollten Active: active (running) sehen, ähnlich wie hier:

● atd.service - Deferred execution scheduler
     Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; preset: enabled)
     Active: active (running) since Tue 2025-07-22 09:36:10 CST; 2s ago
       Docs: man:atd(8)
   Main PID: 7372 (atd)
      Tasks: 1 (limit: 22509)
     Memory: 868.0K
        CPU: 6ms
     CGroup: /system.slice/atd.service
             └─7372 /usr/sbin/atd -f

Damit ist das Lab zur Steuerung von Diensten und Daemons abgeschlossen. Sie haben gelernt, wie Sie Dienste mit systemctl anzeigen, starten, stoppen, neu starten, neu laden, aktivieren, deaktivieren, maskieren und entmaskieren.

Zusammenfassung

In diesem Lab haben wir praktische Erfahrungen mit der Verwaltung von Systemdiensten mithilfe des Befehls systemctl gesammelt, selbst in einer containerisierten Umgebung, in der systemd möglicherweise nicht das primäre Init-System ist. Wir haben gelernt, wie alle geladenen und aktiven Service-Units mit systemctl list-units --type=service aufgelistet werden, und die Spalten UNIT, LOAD, ACTIVE und SUB verstanden, um den Status von Diensten zu interpretieren.

Darüber hinaus haben wir wesentliche Service-Management-Operationen untersucht: den Status eines bestimmten Dienstes mit systemctl status zu überprüfen und den Lebenszyklus von Diensten durch Starten, Stoppen und Neustarten zu steuern. Wir haben auch behandelt, wie Service-Konfigurationen neu geladen, Dienste aktiviert und deaktiviert werden, um ihr Verhalten beim Systemstart zu steuern, sowie die fortgeschrittenen Konzepte des Maskierens und Entmaskierens von Diensten, um deren Start zu verhindern. Diese umfassende Reihe von Fähigkeiten bietet eine solide Grundlage für die Verwaltung von Diensten auf RHEL-Systemen.