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.