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:
- Bearbeiten Sie die Service-Datei:
sudo nano /etc/systemd/system/hello-service.service
- Ändern Sie die Zeile
ExecStart
, um auf ein nicht existierendes Skript zu verweisen:
ExecStart=/home/labex/project/scripts/non-existent.sh
-
Speichern Sie die Datei und verlassen Sie den Editor.
-
Laden Sie die Systemd-Konfiguration neu und versuchen, den Dienst neu zu starten:
sudo systemctl daemon-reload
sudo systemctl restart hello-service
- Ü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'.
- Reparieren Sie die Service-Datei, um auf das richtige Skript zurückzuverweisen:
sudo nano /etc/systemd/system/hello-service.service
- Ändern Sie die Zeile
ExecStart
zurück zu:
ExecStart=/home/labex/project/scripts/hello-service.sh
- Speichern Sie und verlassen Sie, laden Sie dann neu und starten Sie neu:
sudo systemctl daemon-reload
sudo systemctl restart hello-service
- Vergewissern Sie sich, dass der Dienst wieder läuft:
systemctl status hello-service
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:
-
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.
-
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.
-
Service-Vorlagen verwenden: Für Dienste, die mehrere Instanzen erfordern, verwenden Sie Service-Vorlagen (Dateien mit dem Namen [email protected]
), um Duplikate zu vermeiden.
-
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.
-
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.