# 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.

Source: https://www.jpkc.com/db/cheatsheets/macos/launchctl/

<!-- PROSE:intro -->
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.
<!-- PROSE:intro:end -->

## Auflisten & Informationen

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

```bash
launchctl list
```

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

```bash
launchctl list | grep ssh
```

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

```bash
sudo launchctl print system/com.apple.sshd
```

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

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

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

```bash
sudo launchctl blame system/com.apple.sshd
```

## Starten & Stoppen (modern)

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

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

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

```bash
sudo launchctl bootout system/com.example.myservice
```

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

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

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

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

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

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

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

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

## Veraltete Befehle

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

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

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

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

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

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

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

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

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

```bash
launchctl start com.example.myagent
```

`launchctl stop <label>` — Stoppt einen laufenden Dienst.

```bash
launchctl stop com.example.myagent
```

## Aktivieren & Deaktivieren

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

```bash
sudo launchctl enable system/com.example.myservice
```

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

```bash
sudo launchctl disable system/com.example.myservice
```

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

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

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

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

## plist-Speicherorte

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

```bash
ls ~/Library/LaunchAgents/
```

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

```bash
ls /Library/LaunchAgents/
```

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

```bash
ls /Library/LaunchDaemons/
```

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

```bash
ls /System/Library/LaunchDaemons/
```

<!-- PROSE:outro -->
## 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.

## Weiterführende Links

- [launchd – Apple Developer Documentation](https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingLaunchdJobs.html) – offizielle Anleitung zum Erstellen von Daemons und Agents (englisch)
- [launchctl(1) – Befehlsreferenz](https://ss64.com/mac/launchctl.html) – Übersicht aller Subkommandos und Optionen (englisch)
<!-- PROSE:outro:end -->

## Verwandte Kommandos

- [caffeinate](https://www.jpkc.com/db/cheatsheets/macos/caffeinate/) – verhindert, dass der Mac in den Ruhezustand wechselt
- [defaults](https://www.jpkc.com/db/cheatsheets/macos/defaults/) – liest und schreibt macOS-Einstellungen in plists
- [diskutil](https://www.jpkc.com/db/cheatsheets/macos/diskutil/) – verwaltet Festplatten, Volumes und Partitionen

