4.7 Dienststartfehler analysieren
Ein Dienststartfehler liegt vor, wenn ein Dienst nicht gestartet werden kann, im Startvorgang hängen bleibt oder unmittelbar nach dem Start wieder beendet wird.
Grundsatz:
Nicht mehrfach auf „Starten“ klicken. Zuerst Status, Exitcode, Protokolle und Startkonfiguration sichern, damit die ursprüngliche Fehlerursache nicht durch Folgeereignisse verdeckt wird.
Ziele dieser Seite
Nach dieser Seite sollst du:
- verschiedene Arten von Dienststartfehlern unterscheiden können,
- Exitcodes und Beendigungsursachen erfassen können,
- Programmpfad und Startparameter prüfen können,
- Fehler des Dienstkontos und der Berechtigungen erkennen können,
- fehlende Abhängigkeiten und Ressourcen identifizieren können,
- Zeitüberschreitungen und sofortige Prozessabbrüche unterscheiden können,
- Startbegrenzungen und Neustartschleifen erkennen können,
- Windows-, systemd- und launchd-Startfehler analysieren können,
- einen kontrollierten Startversuch vorbereiten und auswerten können.
1. Arten von Dienststartfehlern unterscheiden
| Fehlerbild | Beschreibung | Mögliche Ursache |
|---|---|---|
| Dienst nicht gefunden | Dienstverwaltung kennt den Namen nicht | Falscher Name, Dienst nicht installiert oder andere Umgebung |
| Dienst deaktiviert | Start wird durch Konfiguration verhindert | Bewusste Deaktivierung oder fehlerhafte Änderung |
| Dienst maskiert | systemd blockiert den Start vollständig | Administrativer Schutz oder fehlerhafte Maskierung |
| Programmdatei fehlt | Angegebene ausführbare Datei ist nicht vorhanden | Unvollständiges Update, Löschung oder falscher Pfad |
| Zugriff verweigert | Dienst darf Programm, Datei oder Ressource nicht verwenden | Konto- oder Berechtigungsfehler |
| Abhängigkeit fehlt | Benötigter Dienst oder Backend ist nicht verfügbar | Dienst-, DNS-, Netzwerk- oder Speicherfehler |
| Start dauert zu lange | Dienst meldet nicht rechtzeitig Betriebsbereitschaft | Blockierte Initialisierung oder langsames Backend |
| Prozess beendet sich sofort | Programm startet und bricht unmittelbar ab | Konfiguration, Portkonflikt oder fehlende Ressource |
| Prozess stürzt ab | Unbehandelte Ausnahme oder schwerer Laufzeitfehler | Softwarefehler, Bibliothek oder inkompatible Version |
| Neustartschleife | Dienst wird automatisch fortlaufend neu gestartet | Wiederherstellungsregel und unveränderte Fehlerursache |
| Startgrenze erreicht | Dienstverwaltung unterbindet weitere Versuche | Zu viele Fehlstarts innerhalb kurzer Zeit |
| Dienst läuft, ist aber nicht bereit | Prozess existiert, Initialisierung ist unvollständig | Backend, Migration, Cache oder Healthcheck |
2. Mindestinformationen vor einem neuen Startversuch sichern
[ ] Datum, Uhrzeit und Zeitzone
[ ] Server und Betriebssystem
[ ] Interner Dienstname beziehungsweise launchd-Label
[ ] Aktueller Dienststatus
[ ] Startart beziehungsweise Aktivierungszustand
[ ] Prozess-ID, falls vorhanden
[ ] Letzter Exitcode
[ ] Dienstspezifischer Exitcode
[ ] Programmpfad und Startparameter
[ ] Dienstkonto
[ ] Formale Abhängigkeiten
[ ] Wiederherstellungs- und Neustartregeln
[ ] Relevante Systemprotokolle
[ ] Relevante Anwendungsprotokolle
[ ] Letzte Konfigurations- oder Softwareänderung
Erst nach dieser Sicherung sollte ein weiterer kontrollierter Startversuch durchgeführt werden.
3. Allgemeiner Diagnoseweg bei Startfehlern
Dienst vorhanden?
↓
Aktiviert und nicht blockiert?
↓
Programmpfad vorhanden?
↓
Startkonfiguration syntaktisch gültig?
↓
Dienstkonto gültig?
↓
Datei- und Verzeichnisrechte ausreichend?
↓
Abhängigkeiten verfügbar?
↓
Port und andere Ressourcen verfügbar?
↓
Prozess startet?
↓
Prozess bleibt aktiv?
↓
Dienst meldet Betriebsbereitschaft?
↓
Anwendungstest erfolgreich?
Empfohlene Reihenfolge:
- Exakten Dienstnamen bestätigen.
- Aktuellen Status erfassen.
- Exitcode und Protokolle sichern.
- Startart und Blockierungen prüfen.
- Programmpfad und Argumente kontrollieren.
- Dienstkonto und Berechtigungen prüfen.
- Abhängigkeiten testen.
- Portkonflikte und Ressourcen prüfen.
- Konfiguration mit Herstellerwerkzeug validieren.
- Einen einzelnen kontrollierten Startversuch durchführen.
- Protokolle während dieses Versuchs beobachten.
- Ergebnis dokumentieren und erneut bewerten.
4. Windows-Dienststatus und Exitcodes erfassen
Grundlegenden Dienststatus anzeigen:
[RO] Get-Service -Name "<DIENSTNAME>"
Erweiterte Dienstinformationen anzeigen:
[RO] Get-CimInstance Win32_Service -Filter "Name='<DIENSTNAME>'" |
Select-Object Name,
DisplayName,
State,
Status,
StartMode,
StartName,
ProcessId,
ExitCode,
ServiceSpecificExitCode
Status mit sc.exe prüfen:
[RO] sc.exe queryex "<DIENSTNAME>"
Wichtige Angaben:
| Angabe | Bedeutung |
|---|---|
STATE |
Aktueller Dienstzustand |
WIN32_EXIT_CODE |
Windows- beziehungsweise Dienstausgangscode |
SERVICE_EXIT_CODE |
Dienstspezifischer Ausgangscode |
CHECKPOINT |
Fortschrittswert bei längeren Zustandswechseln |
WAIT_HINT |
Vom Dienst geschätzte Wartezeit |
PID |
Aktuelle Prozess-ID, sofern vorhanden |
Ein Exitcode
0ist nur dann aussagekräftig, wenn der Dienst regulär beendet wurde. Ein Dienst kann trotzdem seine vorgesehene Funktion nicht bereitgestellt haben.
5. Windows-Startkonfiguration prüfen
Konfiguration des Dienstes anzeigen:
[RO][SENS] sc.exe qc "<DIENSTNAME>"
Konfiguration über CIM anzeigen:
[RO][SENS] Get-CimInstance Win32_Service -Filter "Name='<DIENSTNAME>'" |
Select-Object Name,
StartMode,
StartName,
PathName,
ServiceType,
DesktopInteract
Zu prüfen sind:
| Feld | Prüffrage |
|---|---|
BINARY_PATH_NAME beziehungsweise PathName |
Ist der Programmpfad korrekt? |
| Startparameter | Sind Argumente vollständig und korrekt maskiert? |
SERVICE_START_NAME beziehungsweise StartName |
Wird das vorgesehene Dienstkonto verwendet? |
START_TYPE beziehungsweise StartMode |
Ist der Dienst deaktiviert? |
DEPENDENCIES |
Sind alle formalen Abhängigkeiten vorhanden? |
TYPE beziehungsweise ServiceType |
Passt die Dienstart zur Anwendung? |
Wichtig bei Programmpfaden:
- Programmpfad und Argumente dürfen nicht verwechselt werden.
- Leerzeichen im Pfad erfordern korrekte Anführungszeichen.
- Relative Pfade können im Dienstkontext anders aufgelöst werden.
- Ein Netzlaufwerksbuchstabe aus einer Benutzersitzung steht einem Dienst normalerweise nicht automatisch zur Verfügung.
- Das Dienstkonto muss auf Programm, Arbeitsverzeichnis und Konfiguration zugreifen können.
6. Windows-Programmpfad kontrolliert prüfen
Da PathName auch Argumente enthalten kann, darf die gesamte Zeichenfolge nicht ungeprüft an Test-Path übergeben werden.
Konfigurierte Zeichenfolge zunächst nur anzeigen:
[RO][SENS] Get-CimInstance Win32_Service -Filter "Name='<DIENSTNAME>'" |
Select-Object Name, PathName
Anschließend wird der tatsächliche ausführbare Pfad aus der Ausgabe ermittelt und separat geprüft:
[RO][FILE] Test-Path -LiteralPath "<AUSFÜHRBARE_DATEI>"
Dateiinformationen anzeigen:
[RO][FILE][SENS] Get-Item -LiteralPath "<AUSFÜHRBARE_DATEI>" |
Select-Object FullName, Length, CreationTime, LastWriteTime, VersionInfo
Berechtigungen anzeigen:
[RO][FILE][SENS] Get-Acl -LiteralPath "<AUSFÜHRBARE_DATEI>" |
Format-List
Zusätzlich prüfen:
- Ist die Datei tatsächlich vorhanden?
- Wurde sie kürzlich ersetzt oder verschoben?
- Passt die Architektur zum Betriebssystem?
- Sind benötigte Bibliotheken vorhanden?
- Blockiert Sicherheitssoftware die Ausführung?
- Liegt die Datei auf einem beim Start noch nicht verfügbaren Datenträger?
- Ist der Pfad lokal oder von einer Netzwerkressource abhängig?
7. Windows-Dienstkonto und Anmelderechte prüfen
Dienstkonto anzeigen:
[RO] Get-CimInstance Win32_Service -Filter "Name='<DIENSTNAME>'" |
Select-Object Name, StartName, State, StartMode
Mögliche Kontotypen:
-
LocalSystem, -
NT AUTHORITY\LocalService, -
NT AUTHORITY\NetworkService, - virtuelles Dienstkonto,
- verwaltetes Dienstkonto,
- lokales Benutzerkonto,
- Domänenkonto.
Zu prüfen:
- Existiert das Konto?
- Ist es aktiviert oder gesperrt?
- Ist ein hinterlegtes Kennwort abgelaufen oder geändert worden?
- Besitzt es das Recht „Anmelden als Dienst“?
- Darf es die Programmdatei lesen und ausführen?
- Darf es Konfigurations- und Datenverzeichnisse verwenden?
- Darf es Zertifikate und private Schlüssel verwenden?
- Darf es auf Netzwerkressourcen zugreifen?
- Wurde das Konto kürzlich geändert?
- Funktioniert ein verwaltetes Dienstkonto ordnungsgemäß?
Ein manueller Programmstart als Administrator beweist nicht, dass das Programm unter dem tatsächlichen Dienstkonto funktioniert.
8. Typische Windows-Startfehler einordnen
| Fehler | Typische Bedeutung | Prüfrichtung |
|---|---|---|
| Fehler 2 | Angegebene Datei wurde nicht gefunden | Programmpfad, Bibliothek oder Konfigurationspfad |
| Fehler 5 | Zugriff verweigert | Konto, Rechte oder Sicherheitssoftware |
| Fehler 1068 | Abhängigkeitsdienst oder Abhängigkeitsgruppe konnte nicht gestartet werden | Formale Abhängigkeiten |
| Fehler 1069 | Anmeldung des Dienstkontos fehlgeschlagen | Konto, Kennwort und Anmelderecht |
| Fehler 1053 | Dienst antwortete nicht rechtzeitig auf Start- oder Steuerungsanforderung | Initialisierung, Timeout, Programmfehler |
| Fehler 1067 | Prozess wurde unerwartet beendet | Anwendungsprotokoll, Konfiguration oder Absturz |
| Fehler 1079 | Konto stimmt nicht mit anderen Diensten im gemeinsamen Prozess überein | Dienstkonto und gemeinsam verwendeter Prozess |
| Fehler 193 | Keine gültige Win32-Anwendung | Architektur, Dateityp oder fehlerhafte Programmdatei |
Die vollständige Fehlermeldung, das betroffene Produkt und die Windows-Version müssen immer mit dokumentiert werden. Die Tabelle ist eine Eingrenzungshilfe, kein Ersatz für die konkrete Herstellerdiagnose.
9. Windows-Ereignisse eines Startversuchs auswerten
Service-Control-Manager-Ereignisse der letzten Stunde:
[RO][SENS] Get-WinEvent -FilterHashtable @{
LogName = "System"
ProviderName = "Service Control Manager"
StartTime = (Get-Date).AddHours(-1)
} |
Select-Object TimeCreated,
Id,
LevelDisplayName,
Message
Typische startbezogene Ereignisse filtern:
[RO][SENS] Get-WinEvent -FilterHashtable @{
LogName = "System"
ProviderName = "Service Control Manager"
Id = 7000, 7001, 7009, 7011, 7023, 7024, 7031, 7034
StartTime = (Get-Date).AddHours(-24)
} |
Select-Object TimeCreated, Id, LevelDisplayName, Message
System- und Anwendungsereignisse im festen Zeitfenster verbinden:
[RO][SENS] $startTime = Get-Date "2026-07-31 09:10:00"
$endTime = Get-Date "2026-07-31 09:20:00"
Get-WinEvent -FilterHashtable @{
LogName = "System", "Application"
StartTime = $startTime
EndTime = $endTime
} |
Sort-Object TimeCreated |
Select-Object TimeCreated,
LogName,
ProviderName,
Id,
LevelDisplayName,
Message
10. Windows-Wiederherstellungsaktionen prüfen
Ein Dienst kann nach einem Fehlstart oder Absturz automatisch neu gestartet werden.
Konfigurierte Fehleraktionen anzeigen:
[RO] sc.exe qfailure "<DIENSTNAME>"
Zusätzlichen Fehleraktionsstatus anzeigen:
[RO] sc.exe qfailureflag "<DIENSTNAME>"
Mögliche Aktionen:
- keine Aktion,
- Dienst neu starten,
- Programm ausführen,
- Computer neu starten.
Prüffragen:
- Wird der Dienst automatisch neu gestartet?
- Nach welcher Wartezeit?
- Wie viele Versuche erfolgen?
- Wann wird der Fehlerzähler zurückgesetzt?
- Wird auch bei einem normalen Prozessende eine Fehleraktion ausgelöst?
- Verändert die Wiederherstellung die sichtbare PID?
- Verdeckt die Automatik einen wiederkehrenden Startfehler?
Wiederherstellungsregeln dürfen nicht ungeprüft verändert werden. Sie können die Verfügbarkeit und das Verhalten bei Abstürzen erheblich beeinflussen.
11. systemd-Status und Startursache unter Linux prüfen
Ausführlichen Status anzeigen:
[RO][SENS][PRIV] sudo systemctl status "<DIENST>" --no-pager
Wichtige Zustände strukturiert anzeigen:
[RO] systemctl show "<DIENST>" \
--property=LoadState,ActiveState,SubState,UnitFileState,Result,MainPID,ExecMainCode,ExecMainStatus,StatusErrno,NRestarts
Prüfen, ob die Unit aktiviert ist:
[RO] systemctl is-enabled "<DIENST>"
Prüfen, ob sie fehlgeschlagen ist:
[RO] systemctl is-failed "<DIENST>"
Alle fehlgeschlagenen Units anzeigen:
[RO] systemctl --failed --no-pager
Wichtige Angaben:
| Eigenschaft | Bedeutung |
|---|---|
LoadState |
Wurde die Unit korrekt geladen? |
ActiveState |
Übergeordneter Aktivzustand |
SubState |
Detaillierter Unterzustand |
Result |
Ergebnis des letzten Start- oder Laufvorgangs |
MainPID |
PID des Hauptprozesses |
ExecMainCode |
Art der Prozessbeendigung |
ExecMainStatus |
Exitcode oder Signalnummer |
StatusErrno |
Gemeldeter Fehlerwert, sofern vorhanden |
NRestarts |
Anzahl automatischer Neustarts |
12. systemd-Ergebniswerte interpretieren
Mögliche Result-Werte können unter anderem sein:
| Ergebnis | Typische Bedeutung |
|---|---|
success |
Vorgang wurde aus Sicht von systemd erfolgreich beendet |
exit-code |
Prozess beendete sich mit nicht als erfolgreich bewertetem Exitcode |
signal |
Prozess wurde durch ein Signal beendet |
core-dump |
Prozess wurde durch Signal beendet und erzeugte einen Core Dump |
timeout |
Start-, Stopp- oder Laufzeitgrenze wurde überschritten |
watchdog |
Watchdog-Reaktion blieb aus |
start-limit-hit |
Zu viele Startversuche in kurzer Zeit |
resources |
Benötigte Systemressource konnte nicht bereitgestellt werden |
protocol |
Dienst erfüllte das erwartete Startprotokoll nicht |
dependency |
Eine benötigte Unit schlug fehl |
exec-condition |
Eine konfigurierte Startbedingung verhinderte den Start |
Beendigungsart:
ExecMainCode |
Grundbedeutung |
|---|---|
exited |
Prozess beendete sich über einen Exitcode |
killed |
Prozess wurde durch ein Signal beendet |
dumped |
Prozess wurde durch Signal beendet und erzeugte möglicherweise einen Dump |
Die konkrete Bedeutung von
ExecMainStatushängt davon ab, ob der Prozess regulär beendet oder durch ein Signal beendet wurde. Zusätzlich muss die Dokumentation des Programms geprüft werden.
13. systemd-Unit und wirksame Startparameter prüfen
Wirksame Unit einschließlich Drop-ins anzeigen:
[RO][FILE][SENS] systemctl cat "<DIENST>"
Wichtige Startparameter strukturiert anzeigen:
[RO][SENS] systemctl show "<DIENST>" \
--property=Type,User,Group,ExecStart,ExecStartPre,ExecStartPost,WorkingDirectory,EnvironmentFiles,FragmentPath,DropInPaths
Unit-Datei formal prüfen:
[RO][FILE] systemd-analyze verify "<UNIT-DATEI>"
Zu prüfen sind:
-
Type=, -
ExecStart=, -
ExecStartPre=, -
ExecStartPost=, -
User=undGroup=, -
WorkingDirectory=, -
EnvironmentFile=, -
PIDFile=, -
RuntimeDirectory=, -
StateDirectory=, -
TimeoutStartSec=, -
Restart=, -
RestartSec=, -
StartLimitIntervalSec=, -
StartLimitBurst=.
systemd-analyze verifybenötigt den tatsächlichen Pfad einer Unit-Datei. Der Pfad sollte mitsystemctl show <DIENST> --property=FragmentPathermittelt werden.
14. Linux-Programmpfad und Berechtigungen prüfen
Konfigurierten Startbefehl anzeigen:
[RO][SENS] systemctl show "<DIENST>" --property=ExecStart
Datei des bekannten Programmpfads prüfen:
[RO][FILE] stat "<AUSFÜHRBARE_DATEI>"
Dateityp und Architektur prüfen:
[RO][FILE] file "<AUSFÜHRBARE_DATEI>"
Berechtigungen aller Pfadbestandteile anzeigen:
[RO][FILE] namei -l "<AUSFÜHRBARE_DATEI>"
Dynamische Bibliotheksabhängigkeiten eines geeigneten dynamischen ELF-Programms anzeigen:
[RO][FILE][SENS] ldd "<AUSFÜHRBARE_DATEI>"
Wichtiger Sicherheitshinweis:
ldd sollte nicht ungeprüft auf nicht vertrauenswürdige ausführbare Dateien angewendet werden. Abhängig von System und Binärdatei kann die Auswertung Sicherheitsrisiken besitzen.
Alternativ kann bei ELF-Dateien zunächst statisch geprüft werden:
[RO][FILE] readelf -d "<AUSFÜHRBARE_DATEI>"
Zu prüfen:
- Datei vorhanden,
- ausführbar,
- richtige Architektur,
- korrekter Interpreter,
- benötigte Bibliotheken vorhanden,
- Dienstkonto kann alle Pfadbestandteile durchlaufen,
- Arbeitsverzeichnis vorhanden,
- Dateisystem nicht schreibgeschützt,
- Sicherheitsmechanismen wie SELinux oder AppArmor berücksichtigt.
15. Linux-Dienstkonto und Dienstkontext prüfen
Konfiguriertes Konto anzeigen:
[RO] systemctl show "<DIENST>" --property=User,Group,DynamicUser
Benutzerkonto prüfen:
[RO] getent passwd "<DIENSTBENUTZER>"
Gruppenmitgliedschaften anzeigen:
[RO] id "<DIENSTBENUTZER>"
Arbeitsverzeichnis prüfen:
[RO] systemctl show "<DIENST>" --property=WorkingDirectory
Referenzierte Umgebungsdateien anzeigen:
[RO][SENS] systemctl show "<DIENST>" --property=EnvironmentFiles
Zu prüfen:
- Existiert der Dienstbenutzer?
- Existiert die konfigurierte Gruppe?
- Sind Dateirechte ausreichend?
- Ist ein dynamischer Benutzer vorgesehen?
- Existiert das Arbeitsverzeichnis?
- Kann das Konto Konfigurations- und Datendateien lesen?
- Kann es in erforderliche Verzeichnisse schreiben?
- Kann es privilegierte Ports oder Geräte verwenden?
- Blockieren SELinux, AppArmor oder systemd-Sandboxing den Zugriff?
- Sind Secrets für den Dienstkontext verfügbar?
Das Starten des Programms als
rootist kein gültiger Nachweis für die Funktion unter dem tatsächlichen Dienstkonto.
16. systemd-Protokolle eines Startfehlers auswerten
Protokolle des aktuellen Systemstarts:
[RO][SENS][PRIV] sudo journalctl \
-b \
-u "<DIENST>" \
--no-pager
Letzte 100 Einträge:
[RO][SENS][PRIV] sudo journalctl \
-u "<DIENST>" \
-n 100 \
--output=short-iso \
--no-pager
Fehler und schwerwiegendere Meldungen:
[RO][SENS][PRIV] sudo journalctl \
-u "<DIENST>" \
-p err \
--since "1 hour ago" \
--no-pager
Dienst- und Systemmeldungen im selben Zeitfenster:
[RO][SENS][PRIV] sudo journalctl \
--since "2026-07-31 09:10:00" \
--until "2026-07-31 09:20:00" \
--output=short-iso \
--no-pager
Kernelmeldungen berücksichtigen:
[RO][SENS][PRIV] sudo journalctl \
-k \
-b \
-p warning \
--no-pager
17. systemd-Neustartschleife und Startbegrenzung erkennen
Neustartregeln anzeigen:
[RO] systemctl show "<DIENST>" \
--property=Restart,RestartUSec,NRestarts
Startbegrenzung anzeigen:
[RO] systemctl show "<DIENST>" \
--property=StartLimitIntervalUSec,StartLimitBurst,Result
Anzeichen:
-
NRestartssteigt, - PID wechselt fortlaufend,
- Prozesslaufzeit bleibt sehr kurz,
-
Result=start-limit-hit, - Journal zeigt wiederholte identische Startfehler,
- Dienst ist zwischen den Versuchen kurz erreichbar,
- Healthcheck schlägt fortlaufend fehl.
Fehlerstatus erst nach der Beweissicherung zurücksetzen:
[CHANGE][PRIV] sudo systemctl reset-failed "<DIENST>"
reset-failed:
- startet den Dienst nicht,
- löscht aber den gespeicherten Fehlerzustand,
- setzt bestimmte Zähler für Startbegrenzungen zurück,
- verändert damit Diagnosezustand.
Dieser Befehl darf deshalb erst nach Dokumentation von
Result,NRestarts, Status und Journal verwendet werden.
18. systemd-Diensttypen als mögliche Fehlerursache prüfen
Type= |
Erwartetes Verhalten |
|---|---|
simple |
Gestarteter Prozess gilt unmittelbar als Hauptprozess |
exec |
Start gilt nach erfolgreichem Ausführen des Programms als erfolgt |
forking |
Programm erzeugt Hintergrundprozess; häufig mit PID-Datei |
oneshot |
Prozess führt Aufgabe aus und beendet sich wieder |
notify |
Dienst meldet systemd ausdrücklich Betriebsbereitschaft |
dbus |
Bereitschaft hängt von einem D-Bus-Namen ab |
idle |
Ausführung wird verzögert, bis andere Jobs abgearbeitet sind |
Mögliche Fehlkonfigurationen:
-
forkingverwendet falsche oder fehlende PID-Datei, -
notify-Dienst sendet keine Bereitschaftsmeldung, -
oneshotwird fälschlich als dauerhaft laufender Prozess erwartet, - Programm forkt, obwohl
Type=simpleungeeignet konfiguriert wurde, - Wrapperprozess beendet sich und systemd überwacht nicht den erwarteten Prozess,
- Startbefehl blockiert und erreicht den vorgesehenen Zustand nicht.
Der korrekte Diensttyp muss anhand der Programmdokumentation und des tatsächlichen Prozessverhaltens bestimmt werden.
19. launchd-Status und letzten Exitstatus unter macOS prüfen
Systemweiten Dienst prüfen:
[RO] launchctl print "system/<LABEL>"
Benutzerbezogenen Dienst prüfen:
[RO] launchctl print "gui/$(id -u)/<LABEL>"
Relevante Angaben können sein:
state
pid
runs
last exit code
program
arguments
reason
path
Deaktivierungsüberschreibungen prüfen:
[RO] launchctl print-disabled system
GUI-Domain des aktuellen Benutzers prüfen:
[RO] launchctl print-disabled "gui/$(id -u)"
Wichtig:
- Fehlende PID kann bei einem bedarfsgesteuerten Job normal sein.
- Ein von null abweichender letzter Exitstatus ist ein Diagnosehinweis.
- Eine steigende Anzahl unter
runskann auf wiederholte Startversuche hinweisen. - Ein Job mit
KeepAlivekann nach einem Fehler automatisch erneut gestartet werden. - Häufige schnelle Fehlstarts können von launchd gedrosselt werden.
20. launchd-Konfiguration unter macOS prüfen
Bekannte systemweite plist anzeigen:
[RO][FILE][SENS] plutil -p "/Library/LaunchDaemons/<LABEL>.plist"
Formale plist-Prüfung durchführen:
[RO][FILE] plutil -lint "/Library/LaunchDaemons/<LABEL>.plist"
Benutzerbezogene plist prüfen:
[RO][FILE][SENS] plutil -p "$HOME/Library/LaunchAgents/<LABEL>.plist"
Zu prüfen sind:
| Schlüssel | Prüffrage |
|---|---|
Label |
Stimmt das Label mit dem verwendeten Dienstziel überein? |
Program |
Existiert das Programm? |
ProgramArguments |
Sind Programm und Argumente korrekt angeordnet? |
WorkingDirectory |
Existiert das Arbeitsverzeichnis? |
UserName |
Existiert das Konto und besitzt es die nötigen Rechte? |
GroupName |
Existiert die Gruppe? |
KeepAlive |
Wird ein fehlerhafter Prozess wiederholt gestartet? |
RunAtLoad |
Soll der Job beim Laden gestartet werden? |
StandardOutPath |
Kann die Datei beziehungsweise das Verzeichnis verwendet werden? |
StandardErrorPath |
Kann die Fehlerausgabe geschrieben werden? |
EnvironmentVariables |
Sind erforderliche Variablen vorhanden? |
ProgramArgumentsist ein Array. Das erste Element bezeichnet üblicherweise das auszuführende Programm, wenn nicht zusätzlichProgramangegeben wurde.
21. macOS-Programmpfad und Berechtigungen prüfen
Programmdatei prüfen:
[RO][FILE] stat "<AUSFÜHRBARE_DATEI>"
Dateityp und Architektur anzeigen:
[RO][FILE] file "<AUSFÜHRBARE_DATEI>"
Berechtigungen und erweiterte Zugriffslisten anzeigen:
[RO][FILE][SENS] ls -lde "<AUSFÜHRBARE_DATEI>"
Code-Signatur anzeigen und prüfen:
[RO][FILE][SENS] codesign \
--verify \
--deep \
--strict \
--verbose=2 \
"<AUSFÜHRBARE_DATEI>"
Gatekeeper-Bewertung für einen geeigneten Anwendungstyp prüfen:
[RO][FILE][SENS] spctl \
--assess \
--type execute \
--verbose=4 \
"<AUSFÜHRBARE_DATEI>"
Hinweise:
-
codesignprüft die Signatur, beweist aber nicht die vollständige Dienstfunktion. -
spctlist nicht für jede Art von Binärdatei gleich aussagekräftig. - Datenschutz- und Sicherheitsmechanismen können den Zugriff eines Daemons einschränken.
- Ein erfolgreicher Start im Terminal beweist nicht die Funktion innerhalb der launchd-Domain.
22. macOS-Protokolle eines Startfehlers auswerten
Nach Prozess suchen:
[RO][SENS][PRIV] sudo log show \
--last 1h \
--predicate 'process == "<PROZESS>"' \
--style compact \
--no-pager
Nach launchd- und Prozessmeldungen suchen:
[RO][SENS][PRIV] sudo log show \
--last 1h \
--predicate 'process == "launchd" OR process == "<PROZESS>"' \
--style compact \
--no-pager
Fehler und Faults anzeigen:
[RO][SENS][PRIV] sudo log show \
--last 1h \
--predicate '(process == "launchd" OR process == "<PROZESS>") AND (messageType == error OR messageType == fault)' \
--style compact \
--no-pager
Live-Beobachtung während eines kontrollierten Startversuchs:
[TEST][SENS][PRIV] sudo log stream \
--timeout 5m \
--predicate 'process == "launchd" OR process == "<PROZESS>"' \
--style compact
23. launchctl-Fehlercode unter macOS übersetzen
Wenn ein launchctl-Befehl einen numerischen Fehlercode liefert, kann dieser mit launchctl error lesbarer dargestellt werden.
Automatische Einordnung versuchen:
[RO] launchctl error <FEHLERCODE>
POSIX-Fehlerbereich angeben:
[RO] launchctl error posix <FEHLERCODE>
Mach-Fehlerbereich angeben:
[RO] launchctl error mach <FEHLERCODE>
Bootstrap-Fehlerbereich angeben:
[RO] launchctl error bootstrap <FEHLERCODE>
Die übersetzte Meldung beschreibt den technischen Fehlerbereich. Die konkrete Ursache muss weiterhin anhand von plist, Programmpfad, Berechtigungen und Protokollen bestimmt werden.
24. Kontrollierten Startversuch durchführen
Ein Startversuch verändert den Dienstzustand und kann Folgeprozesse, Netzwerkverbindungen oder automatische Wiederherstellungsaktionen auslösen.
| Betriebssystem | Startbefehl |
|---|---|
| Windows | [CHANGE][PRIV] Start-Service -Name "<DIENSTNAME>" |
| Linux | [CHANGE][PRIV] sudo systemctl start "<DIENST>" |
| macOS systemweit | [CHANGE][PRIV] sudo launchctl kickstart "system/<LABEL>" |
| macOS Benutzerkontext | [CHANGE] launchctl kickstart "gui/$(id -u)/<LABEL>" |
macOS – PID bei erfolgreichem kickstart ausgeben:
[CHANGE][PRIV] sudo launchctl kickstart \
-p \
"system/<LABEL>"
Ablauf:
1. Aktuellen Status und Protokolle sichern
2. Live-Protokollansicht vorbereiten
3. Genaue Startzeit notieren
4. Genau einen Startversuch ausführen
5. Rückgabemeldung vollständig erfassen
6. Dienststatus sofort prüfen
7. Prozess-ID und Laufzeit prüfen
8. Listener prüfen
9. Neue Protokollmeldungen sichern
10. Anwendungstest durchführen
11. Keine weiteren Versuche ohne neue Erkenntnis starten
25. Manuellen Programmstart nur kontrolliert verwenden
Ein direkter Programmstart kann zusätzliche Fehlermeldungen auf der Konsole sichtbar machen. Er ist aber nicht automatisch sicher oder mit dem Dienststart gleichwertig.
Vorher prüfen:
- erlaubt der Hersteller einen Konsolen- oder Vordergrundmodus?
- ist der Dienstprozess wirklich beendet?
- würde eine zweite Instanz denselben Port oder dieselben Dateien verwenden?
- werden beim Start Datenbanken oder Dateien verändert?
- welches Benutzerkonto muss verwendet werden?
- welche Umgebungsvariablen setzt die Dienstverwaltung?
- welches Arbeitsverzeichnis wird erwartet?
- welche Limits und Sicherheitsrichtlinien gelten?
- existiert ein ausdrücklich dokumentierter Diagnoseparameter?
Der manuelle Start kann sich unterscheiden durch:
| Eigenschaft | Dienststart | Manueller Start |
|---|---|---|
| Benutzerkonto | Dienstkonto | Aktueller Terminalbenutzer |
| Arbeitsverzeichnis | Konfiguriert oder systemabhängig | Aktuelles Verzeichnis |
| Umgebungsvariablen | Dienstspezifisch | Shell- beziehungsweise Benutzervariablen |
| Berechtigungen | Dienstkontext | Benutzer- oder Administratorkontext |
| Netzwerkressourcen | Dienstabhängig | Benutzersitzung |
| Sicherheitsrichtlinien | Dienstmanager und Sandbox | Terminalkontext |
| Standardausgabe | Journal, Datei oder Ereignisprotokoll | Terminal |
Deshalb wird kein generischer Direktstartbefehl verwendet. Der korrekte Diagnosemodus muss aus der offiziellen Dokumentation der jeweiligen Anwendung stammen.
26. Häufige technische Ursachen eines sofortigen Abbruchs
- Syntaxfehler in der Konfiguration,
- fehlende Konfigurationsdatei,
- falscher Programmpfad,
- fehlende Bibliothek oder Laufzeitumgebung,
- falsche Prozessorarchitektur,
- Port bereits belegt,
- ungültiges Zertifikat oder fehlender privater Schlüssel,
- Dienstkonto besitzt keine Leserechte,
- Datenverzeichnis ist nicht beschreibbar,
- Volume oder Netzfreigabe fehlt,
- Datenbank nicht erreichbar,
- DNS-Auflösung fehlerhaft,
- Umgebungsvariable fehlt,
- Secret oder Kennwort ungültig,
- Lizenz fehlt oder ist abgelaufen,
- Datenmigration ist fehlgeschlagen,
- PID-Datei kann nicht erstellt werden,
- Sperrdatei einer alten Instanz ist vorhanden,
- Sicherheitssoftware blockiert die Ausführung,
- Speicher oder Dateideskriptoren sind erschöpft.
27. Zeitüberschreitung beim Dienststart analysieren
Ein Timeout bedeutet zunächst, dass ein erwarteter Zustand nicht innerhalb der vorgesehenen Zeit erreicht wurde.
Mögliche Ursachen:
- DNS-Abfrage dauert zu lange,
- Datenbank ist nicht bereit,
- Netzwerkspeicher antwortet nicht,
- Anwendung führt eine lange Migration durch,
- Dienst wartet auf eine gesperrte Datei,
- Portbindung blockiert,
- Dienst meldet seine Bereitschaft nicht korrekt,
- Diensttyp passt nicht zum Programmverhalten,
- Hardware oder Datenträger ist langsam,
- Entschlüsselung oder Zertifikatsprüfung hängt,
- Dienst wartet auf interaktive Eingabe,
- Endlosschleife während der Initialisierung.
Prüfung:
1. Startzeit genau feststellen
2. Letzte Meldung vor dem Timeout ermitteln
3. Prozesszustand während des Wartens prüfen
4. CPU- und I/O-Verhalten beobachten
5. Netzwerkverbindungen des Prozesses prüfen
6. Abhängigkeiten direkt testen
7. Herstellerdokumentation zur Initialisierung prüfen
8. Timeout nicht erhöhen, bevor die Warteursache bekannt ist
Eine Vergrößerung des Timeouts kann einen langsamen, aber legitimen Start ermöglichen. Sie kann jedoch ebenso einen eigentlichen Fehler nur länger verbergen.
28. Portkonflikt als Startursache prüfen
Windows:
[RO] Get-NetTCPConnection `
-State Listen `
-LocalPort <PORT> `
-ErrorAction SilentlyContinue |
Select-Object LocalAddress, LocalPort, OwningProcess
Linux:
[RO][PRIV] sudo ss -lntp "sport = :<PORT>"
macOS:
[RO][PRIV] sudo lsof \
-nP \
-iTCP:<PORT> \
-sTCP:LISTEN
Wenn der Port belegt ist:
- PID feststellen.
- Prozessname bestimmen.
- Dienstzuordnung prüfen.
- Bindungsadresse kontrollieren.
- Prüfen, ob eine alte Instanz läuft.
- Container- oder Proxybelegung berücksichtigen.
- Keinen Prozess ungeprüft beenden.
- Sollkonfiguration und letzte Änderungen prüfen.
29. Ressourcenmangel als Startursache prüfen
| Aufgabe | Windows | Linux | macOS |
|---|---|---|---|
| Freier Speicherplatz | [RO] Get-Volume |
[RO] df -hT |
[RO] df -h |
| Arbeitsspeicher | [RO] Get-CimInstance Win32_OperatingSystem | Select-Object TotalVisibleMemorySize,FreePhysicalMemory |
[RO] free -h |
[RO] vm_stat |
| Prozessübersicht | [RO] Get-Process | Sort-Object WorkingSet64 -Descending |
[RO] top |
[RO] top -o mem |
| Dateisystemzustand | [RO] Get-Volume |
[RO] findmnt |
[RO] mount |
| Offene Dateien des Prozesses | Betriebssystemspezifische Prozesswerkzeuge | [RO][PRIV] sudo lsof -p <PID> |
[RO][PRIV] sudo lsof -p <PID> |
Mögliche Startfehler:
- Datenträger vollständig belegt,
- keine freien Inodes unter Linux,
- Arbeitsspeicher erschöpft,
- Auslagerung überlastet,
- Dateisystem schreibgeschützt,
- maximales Prozesslimit erreicht,
- Dateideskriptorlimit erreicht,
- temporäres Verzeichnis nicht verfügbar,
- Laufzeitverzeichnis kann nicht erstellt werden.
30. Letzte Änderungen priorisiert untersuchen
Besonders relevant sind Änderungen an:
- Programmversion,
- Dienstdatei oder plist,
- Windows-Dienstkonfiguration,
- systemd-Unit oder Drop-in,
- Dienstkonto oder Kennwort,
- Dateiberechtigungen,
- Zertifikaten,
- Port und Bindungsadresse,
- Firewall,
- Datenbankversion oder Schema,
- Bibliotheken und Laufzeitumgebung,
- Umgebungsvariablen,
- Secrets,
- Mounts und Volumes,
- Containern oder Images,
- Sicherheitssoftware,
- Betriebssystemupdates.
Zeitlicher Vergleich:
Letzter erfolgreicher Start
→ Änderung
→ erster fehlgeschlagener Start
Ein zeitlicher Zusammenhang ist ein starker Hinweis, aber noch kein Beweis. Die betroffene Konfiguration oder Komponente muss technisch geprüft werden.
31. Typische Fehlinterpretationen
| Fehlinterpretation | Richtige Bewertung |
|---|---|
| „Der Startknopf zeigt einen Fehler, also ist Windows beziehungsweise systemd defekt.“ | Die Dienstverwaltung meldet häufig nur den Fehler des gestarteten Programms |
| „Exitcode 0 bedeutet, der Dienst funktioniert.“ | Nur die gemeldete Beendigung wurde als erfolgreich bewertet |
| „Der Prozess war kurz sichtbar, also startete der Dienst erfolgreich.“ | Er kann während der Initialisierung abgebrochen sein |
| „Manueller Start als Administrator funktioniert, also stimmen die Dienstrechte.“ | Der Dienst verwendet einen anderen Kontext |
| „Mehr Startversuche erhöhen die Chance auf Erfolg.“ | Sie können Protokolle überlagern und Startbegrenzungen auslösen |
| „Timeout erhöhen löst den Fehler.“ | Die eigentliche Warteursache bleibt möglicherweise bestehen |
| „Die Konfigurationsdatei ist syntaktisch gültig, also ist sie fachlich korrekt.“ | Pfade, Konten und Backends können weiterhin falsch sein |
| „Der Port ist frei, also muss der Dienst starten.“ | Viele weitere Startvoraussetzungen bleiben ungeprüft |
| „Ein Neustartzähler beweist einen Softwarefehler.“ | Auch fehlende Abhängigkeiten oder Rechte können Wiederholungen auslösen |
| „Fehlerstatus zurücksetzen repariert den Dienst.“ | Nur gespeicherter Zustand und Zähler werden zurückgesetzt |
32. Checkliste zur Analyse eines Dienststartfehlers
[ ] Exakten Dienstnamen beziehungsweise Label bestätigt
[ ] Richtigen Server und richtige Umgebung bestätigt
[ ] Aktuellen Status gesichert
[ ] Exitcode und dienstspezifischen Exitcode erfasst
[ ] Relevante Protokolle vor neuem Startversuch gesichert
[ ] Startart und Deaktivierung geprüft
[ ] systemd-Maskierung beziehungsweise launchd-Override geprüft
[ ] Programmpfad und Startparameter geprüft
[ ] Programmdatei vorhanden
[ ] Dateityp und Architektur geprüft
[ ] Dienstkonto und Gruppe geprüft
[ ] Datei- und Verzeichnisrechte geprüft
[ ] Arbeitsverzeichnis geprüft
[ ] Umgebungs- und Konfigurationsdateien ermittelt
[ ] Formale Abhängigkeiten geprüft
[ ] Externe Backends geprüft
[ ] Portkonflikt ausgeschlossen
[ ] Speicherplatz und Arbeitsspeicher geprüft
[ ] Neustartregeln und Startbegrenzungen geprüft
[ ] Letzte Änderungen erfasst
[ ] Genau einen kontrollierten Startversuch durchgeführt
[ ] Prozess, PID und Laufzeit danach geprüft
[ ] Listener und Anwendungsfunktion geprüft
[ ] Ursache, Maßnahme und Ergebnis dokumentiert
Bewertung des Ergebnisses
| Ergebnis | Nächster Schritt |
|---|---|
| Dienst nicht vorhanden | Installation, Dienstname und Zielsystem prüfen |
| Dienst deaktiviert oder maskiert | Grund und Sollzustand vor Änderung klären |
| Programmdatei fehlt | Installation, Update und Dateisystem untersuchen |
| Zugriff verweigert | Dienstkonto, Rechte und Sicherheitsrichtlinien prüfen |
| Abhängigkeit schlägt fehl | Betroffene Abhängigkeit separat analysieren |
| Port ist belegt | Besitzenden Prozess und Konfiguration untersuchen |
| Konfiguration ist ungültig | Fehlerstelle mit Herstellerwerkzeug bestimmen |
| Prozess beendet sich mit Exitcode | Produktspezifische Bedeutung des Codes prüfen |
| Prozess wird durch Signal beendet | Signalursache, Ressourcen und Absturzdiagnose prüfen |
| Start läuft in Timeout | Letzte Initialisierungsphase und Abhängigkeiten untersuchen |
| Startgrenze wurde erreicht | Fehlerzustand sichern und Grund der Fehlstarts beheben |
| Dienst startet und bleibt aktiv | Listener und Anwendungstest durchführen |
Merksatz
Ein Dienststartfehler ist selten mit einem weiteren Startversuch erklärt. Entscheidend ist die erste Phase, in der Sollzustand und tatsächlicher Startablauf voneinander abweichen.
Weiterführende Quellen
- Microsoft Learn – Win32_Service
- Microsoft Learn – sc.exe query
- Microsoft Learn – sc.exe qc
- Microsoft Learn – sc.exe qfailure
- Microsoft Learn – Get-WinEvent
- systemd – systemctl
- systemd – systemd.service
- systemd – systemd.exec
- systemd – systemd-analyze
- systemd – journalctl
- Apple – launchctl-Handbuchseite
- Apple – launchd.plist-Handbuchseite
- Apple – plutil-Handbuchseite
- Apple – log-Handbuchseite