launchd: macOS
launchd: het macOS-init-systeem dat alles in beweging zet
`launchd` is het centrale init-systeem van macOS, verantwoordelijk voor het starten, beheren en stoppen van systemen en taken tijdens en na de opstart van de computer. Het is de motor achter de schermen die ervoor zorgt dat diensten, applicaties en achtergrondprocessen op het juiste moment worden geactiveerd. Het systeem is ontworpen om flexibel, efficiënt en betrouwbaar te zijn, en vervangt een reeks oudere Unix-mechanismen zoals `init`, `cron`, `inetd` en `rc`-scripts. launchd is niet zomaar een tool of een daemon: het is de bouwsteen van het moderne macOS-systeembeheer.
Het werd geïntroduceerd met Mac OS X 10.4 Tiger, dat op 29 april 2005 officieel werd uitgebracht. Met de komst van Tiger bracht Apple een reeks nieuwe functies, en launchd was een van de meest ingrijpende technische innovaties. Bronnen omschrijven het expliciet als een "new startup daemon" en stellen dat het ontworpen was als een vervanging voor de bestaande methoden om processen te starten bij opstart of op aanvraag. Door deze integratie kon Apple een uniformer, sneller en beter beheersbaar systeem creëren waarin de complexiteit van meerdere afzonderlijke initiatoren (zoals cron voor tijdsgebaseerde taken en inetd voor netwerkverzoeken) werd samengebracht in één centrale instantie.
De ontwikkeling van launchd werd geleid door Dave Zarzycki, een ingenieur bij Apple die de software ontwierp en programmeerde. Zijn bijdrage markeerde een belangrijke stap in de evolutie van het macOS-kernelniveaubeheer. Zarzycki's ontwerp richtte zich op efficiëntie en veiligheid: processen worden pas gestart wanneer ze daadwerkelijk nodig zijn, wat energie en systeembronnen bespaart. Dit "on-demand"-principe is een kernkenmerk van launchd. In tegenstelling tot traditionele init-systemen die bij opstart alle daemons laden, wacht launchd af tot er een aanvraag komt – bijvoorbeeld wanneer een gebruiker een bepaalde dienst activeert of een netwerkaanvraag binnenkomt.
Apple kondigde Mac OS X 10.4 Tiger publiekelijk aan tijdens de WWDC 2005, de jaarlijkse ontwikkelaarconferentie. De officiële keynote vond plaats op 6 juni 2005 om 10:00 uur in Moscone West, San Francisco. Tijdens deze presentatie werd onder andere de introductie van launchd benadrukt als onderdeel van de nieuwe technische fundamenten van het besturingssysteem. Hoewel de conferentie gericht was op ontwikkelaars en geïnteresseerden, markeerde deze aankondiging het begin van een bredere erkenning van launchd binnen de technische gemeenschap. De software zou niet alleen binnen macOS blijven, maar zou ook invloed uitoefenen op andere Unix-achtige systemen, met name FreeBSD, dat later onderdelen van launchd zou adopteren of ervan zou leren.
Een belangrijk aspect van launchd is dat Apple de broncode ervan openbaar heeft gemaakt. De openbare versie werd uitgebracht onder de Apple Public Source License (APSL), gekoppeld aan de release van Mac OS X 10.4. Dit maakte het mogelijk voor ontwikkelaars en onderzoekers om de werking van het systeem te bestuderen, aan te passen en te begrijpen. De beschikbaarheid van de broncode heeft bijgedragen aan de transparantie en het vertrouwen in het systeem, en heeft het mogelijk gemaakt dat andere projecten, zoals FreeBSD, elementen ervan konden integreren in hun eigen init-systemen. De FreeBSD-wikipagina bevestigt deze openbare release en noemt zowel de Apple-broncode als de licentie, wat een belangrijke externe verificatie is van dit feit.
Op technisch niveau is launchd verantwoordelijk voor het beheren van "jobs" – een algemene term voor processen of taken die door het systeem of gebruikers worden gedefinieerd. Deze jobs worden beschreven in XML-bestanden met de extensie `.plist` (property list). Elke job heeft een unieke identifier, zoals `com.harry.backup`, en bevat instellingen zoals wanneer het proces moet starten, onder welke gebruiker het moet draaien, of het automatisch opnieuw moet starten bij crash, en of het moet reageren op bepaalde gebeurtenissen.
Deze `.plist`-bestanden worden opgeslagen in verschillende mappen, afhankelijk van het type job en het bereik. Voor gebruikersspecifieke taken worden zij opgeslagen in `~/Library/LaunchAgents/`. Voor systeemwijde taken, die actief zijn ongeacht welke gebruiker is aangemeld, staan ze in `/Library/LaunchDaemons/` of `/System/Library/LaunchDaemons/`. Het onderscheid tussen "Agents" en "Daemons" is belangrijk: Agents draaien in de context van een gebruiker en starten pas als die gebruiker is aangemeld, terwijl Daemons als systeemproces werken en al actief kunnen zijn tijdens de opstart.
Om met launchd te werken, gebruikt men het commando `launchctl` in de Terminal. Dit is de primaire interface om jobs te beheren. Met `launchctl list` krijgt men een overzicht van alle geladen jobs. Door deze uitvoer te combineren met `grep`, zoals in `launchctl list | grep com.harry`, kan een gebruiker snel zijn eigen of specifieke taken opzoeken. Jobs kunnen handmatig worden geladen of uitgeschakeld met `launchctl load` of `launchctl unload`, gevolgd door het pad naar het `.plist`-bestand. Een job kan ook tijdelijk worden gestart met `launchctl start`, zonder dat de achterliggende trigger (zoals een tijd of gebeurtenis) daadwerkelijk is opgetreden.
Een voorbeeld van een LaunchAgent-bestand ziet er als volgt uit:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.harry.backup</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/bin/backup-script.sh</string>
</array>
<key>StartCalendarInterval</key>
<dict>
<key>Hour</key>
<integer>2</integer>
<key>Minute</key>
<integer>30</integer>
</dict>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>Dit bestand zorgt ervoor dat een back-upscript elke dag om 2:30 uur wordt uitgevoerd, en ook meteen start wanneer de job wordt geladen. Het toont aan hoe launchd niet alleen cron vervangt (via `StartCalendarInterval`), maar ook rc-scripts (via `RunAtLoad`).
launchd is niet alleen verantwoordelijk voor het starten van jobs, maar ook voor het beheren van hun levenscyclus. Het kan bijhouden of een proces nog draait, het opnieuw starten bij een crash (met instellingen zoals `KeepAlive`), en het correct afsluiten bij systeemafsluiting. Dit alles gebeurt op een manier die transparant is voor de gebruiker, maar cruciaal is voor de stabiliteit van het systeem.
Daarnaast ondersteunt launchd socket-activatie: een daemon hoeft niet continu te draaien, maar kan worden gestart zodra er een verbinding wordt gemaakt met een bepaalde poort of socket. Dit vermindert het geheugen- en CPU-gebruik aanzienlijk. Een bekend voorbeeld is de Apache HTTP Server, die via launchd kan worden beheerd met `apachectl start`, wat uiteindelijk een launchd-job activeert onder de naam `org.apache.httpd`.
In het kader van systeembeveiliging is launchd ook geïntegreerd met de modernere macOS-beveiligingsarchitectuur, inclusief sandboxing en permissiebeheer. Hoewel Docker Desktop op macOS beperkt gebruik maakt van launchd, vereist het wel specifieke configuraties die via systeemniveau toegang mogelijk worden gemaakt – toegang die uiteindelijk ook afhangt van de rechten die launchd toekent aan bepaalde processen.
launchd is dus meer dan een init-systeem: het is een geïntegreerde oplossing voor systeemautomatisering, efficiëntie en veiligheid. Het is een onderdeel van de evolutionaire lijn van macOS als modern Unix-afgeleid besturingssysteem, en blijft tot op de dag van vandaag de ruggengraat van het systeembeheer op Apple's desktopplatform.