launchctl — Dienste und Daemons mit launchd steuern

Praxis-Guide zu launchctl — Daemons und Agents unter macOS laden, starten, stoppen und mit moderner bootstrap/bootout-Syntax verwalten.

launchctl ist das Kommandozeilen-Werkzeug, mit dem du launchd steuerst – den zentralen Dienst-Manager von macOS, der Daemons und Agents lädt, startet und stoppt. Dienste werden über Property-List-Dateien (plists) in den LaunchDaemons- und LaunchAgents-Verzeichnissen beschrieben; launchctl meldet sie an, entlädt sie wieder und zeigt dir ihren Status. Dieser Guide führt dich durch die wichtigsten Befehle – von der Status-Abfrage über das moderne bootstrap/bootout bis zum Aktivieren beim Systemstart.

Auflisten & Informationen

launchctl list — Listet alle geladenen Dienste des aktuellen Benutzers auf.

launchctl list

launchctl list | grep <name> — Sucht nach einem bestimmten Dienst.

launchctl list | grep ssh

launchctl print system/<label> — Zeigt Detailinfos zu einem Systemdienst.

sudo launchctl print system/com.apple.sshd

launchctl print gui/$(id -u)/<label> — Zeigt Detailinfos zu einem Benutzerdienst.

launchctl print gui/$(id -u)/com.apple.Spotlight

launchctl blame system/<label> — Zeigt, warum ein Dienst läuft oder nicht.

sudo launchctl blame system/com.apple.sshd

Starten & Stoppen (modern)

launchctl bootstrap system <plist> — Lädt und registriert einen System-Daemon.

sudo launchctl bootstrap system /Library/LaunchDaemons/com.example.myservice.plist

launchctl bootout system/<label> — Entlädt und deregistriert einen System-Daemon.

sudo launchctl bootout system/com.example.myservice

launchctl bootstrap gui/$(id -u) <plist> — Lädt einen Benutzer-Agent.

launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.example.myagent.plist

launchctl bootout gui/$(id -u)/<label> — Entlädt einen Benutzer-Agent.

launchctl bootout gui/$(id -u)/com.example.myagent

launchctl kickstart -k system/<label> — Erzwingt den Neustart eines Dienstes (beenden und neu starten).

sudo launchctl kickstart -k system/com.apple.sshd

launchctl kickstart -p system/<label> — Startet einen Dienst, falls er nicht läuft.

sudo launchctl kickstart -p system/com.example.myservice

Veraltete Befehle

launchctl load <plist> — Lädt einen Dienst (veraltet, nutze stattdessen bootstrap).

launchctl load ~/Library/LaunchAgents/com.example.myagent.plist

launchctl unload <plist> — Entlädt einen Dienst (veraltet, nutze stattdessen bootout).

launchctl unload ~/Library/LaunchAgents/com.example.myagent.plist

launchctl load -w <plist> — Lädt einen Dienst und aktiviert ihn dauerhaft.

launchctl load -w ~/Library/LaunchAgents/com.example.myagent.plist

launchctl unload -w <plist> — Entlädt einen Dienst und deaktiviert ihn dauerhaft.

launchctl unload -w ~/Library/LaunchAgents/com.example.myagent.plist

launchctl start <label> — Startet einen bereits geladenen Dienst.

launchctl start com.example.myagent

launchctl stop <label> — Stoppt einen laufenden Dienst.

launchctl stop com.example.myagent

Aktivieren & Deaktivieren

launchctl enable system/<label> — Aktiviert einen Systemdienst für den Start beim Booten.

sudo launchctl enable system/com.example.myservice

launchctl disable system/<label> — Deaktiviert den Start eines Systemdienstes beim Booten.

sudo launchctl disable system/com.example.myservice

launchctl enable gui/$(id -u)/<label> — Aktiviert einen Benutzer-Agent für den Start bei der Anmeldung.

launchctl enable gui/$(id -u)/com.example.myagent

launchctl disable gui/$(id -u)/<label> — Deaktiviert den Start eines Benutzer-Agents bei der Anmeldung.

launchctl disable gui/$(id -u)/com.example.myagent

plist-Speicherorte

~/Library/LaunchAgents/ — Benutzer-Agents: laufen, wenn sich der Benutzer anmeldet.

ls ~/Library/LaunchAgents/

/Library/LaunchAgents/ — Globale Agents: laufen für alle Benutzer bei der Anmeldung.

ls /Library/LaunchAgents/

/Library/LaunchDaemons/ — Globale Daemons: laufen beim Booten (als root).

ls /Library/LaunchDaemons/

/System/Library/LaunchDaemons/ — System-Daemons (Apple, nicht verändern).

ls /System/Library/LaunchDaemons/

Fazit

launchctl bündelt die komplette Dienst-Steuerung von macOS in einem Befehl – vom schnellen launchctl list bis zum gezielten Neustart einzelner Daemons. Setze im Alltag auf die moderne Syntax mit bootstrap und bootout; das alte load/unload funktioniert zwar noch, gilt aber als veraltet und kennt die Domain-Trennung (system, gui, user) nicht. Für die System-Domain brauchst du sudo, und genau dort ist Vorsicht geboten: Ein bootout oder disable auf einem Apple-Daemon kann zentrale macOS-Funktionen lahmlegen – fass die plists unter /System/Library/LaunchDaemons/ daher nicht an. Verhält sich ein Dienst merkwürdig, führt dich launchctl blame oft schneller zur Ursache als jeder Logdurchlauf.

Verwandte Kommandos

  • caffeinate – verhindert, dass der Mac in den Ruhezustand wechselt
  • defaults – liest und schreibt macOS-Einstellungen in plists
  • diskutil – verwaltet Festplatten, Volumes und Partitionen