gestartet - launchd

startd
Originalautor(en) Dave Zarzycki
Entwickler Apple Inc.
Erstveröffentlichung 29. April 2005 ; Vor 16 Jahren ( 2005-04-29 )
Geschrieben in C
Betriebssystem macOS , FreeBSD , iOS , watchOS
Typ Init- Daemon
Lizenz Proprietäre Software (früher APSL und später Apache License 2.0 )
Webseite Open - Source - .apple .com / tarballs / launchd / Bearbeiten Sie dies auf Wikidata

launchd ist ein Init- und Betriebssystem-Dienstverwaltungs- Daemon, der von Apple Inc. als Teil von macOS entwickelt wurde , um seine BSD- ähnlichen init und SystemStarter zu ersetzen . Es wurden Anstrengungen gewesen Port launchd zu FreeBSD und abgeleitete Systeme.

Komponenten

Es gibt zwei Hauptprogramme im launchd-System: launchd und launchctl.

launchd verwaltet die Daemons sowohl auf System- als auch auf Benutzerebene. Ähnlich wie xinetd kann launchd Daemons bei Bedarf starten. Ähnlich wie watchdogd kann launchd Daemons überwachen, um sicherzustellen, dass sie weiterlaufen. launchd hat auch init als PID 1 auf macOS ersetzt und ist daher für das Starten des Systems beim Booten verantwortlich.

Konfigurationsdateien definieren die Parameter der Dienste, die von launchd ausgeführt werden. Die auf der Eigenschaftsliste basierenden Dateien werden in den Unterverzeichnissen LaunchAgents und LaunchDaemons der Bibliotheksordner gespeichert und verfügen über ungefähr dreißig verschiedene Schlüssel, die festgelegt werden können. launchd selbst hat keine Kenntnis von diesen Konfigurationsdateien oder die Möglichkeit sie zu lesen - dafür ist "launchctl" verantwortlich.

launchctl ist eine Befehlszeilenanwendung, die über IPC mit launchd kommuniziert und weiß, wie die Eigenschaftenlistendateien analysiert werden, die zur Beschreibung von launchd-Jobs verwendet werden, und sie mit einem spezialisierten Wörterbuchprotokoll, das launchd versteht, serialisiert. launchctl kann verwendet werden, um Daemons zu laden und zu entladen, Launchd-gesteuerte Jobs zu starten und zu stoppen, Systemauslastungsstatistiken für launchd und seine untergeordneten Prozesse zu erhalten und Umgebungseinstellungen festzulegen.

startd

launchd hat zwei Hauptaufgaben. Die erste besteht darin , das System zu booten , und die zweite besteht darin, Dienste zu laden und zu warten.

Hier ist eine vereinfachte Ansicht des Systemstarts von Mac OS X Tiger auf einem PowerPC- Mac (auf einem Intel- Mac ersetzt EFI Open Firmware und boot.efiersetzt BootX ):

  1. Open Firmware aktiviert, initialisiert die Hardware und lädt dann BootX.
  2. BootX lädt den Kernel, dreht den Pinwheel-Cursor und lädt alle benötigten Kernel-Erweiterungen (kexts).
  3. Der Kernel lädt launchd.
  4. launchd führt /etc/rcverschiedene Skripte aus, die durch /System/Library/LaunchDaemonsund scannen /Library/LaunchDaemons, ruft nach Bedarf launchctl in den plists auf, dann startet launchd das Anmeldefenster.

In Schritt 4 durchsuchen die Startskripts einige verschiedene Verzeichnisse nach auszuführenden Jobs. Es gibt zwei verschiedene Verzeichnisse, die gescannt werden:

  1. Die LaunchDaemons-Verzeichnisse enthalten Elemente, die als Root ausgeführt werden, im Allgemeinen Hintergrundprozesse.
  2. Die LaunchAgents-Verzeichnisse enthalten Jobs, sogenannte Agent-Anwendungen, die als Benutzer oder im Kontext des Benutzerlandes ausgeführt werden. Dies können Skripte oder andere Vordergrundelemente sein, und sie können sogar eine Benutzeroberfläche enthalten.

Diese Verzeichnisse werden alle in den typischen Bibliotheksverzeichnissen von Mac OS X gespeichert.

launchd unterscheidet sich stark von SystemStarter darin, dass es möglicherweise nicht alle Daemons beim Booten startet. Der Schlüssel zu launchd und ähnlich wie bei xinetd ist die Idee von Launch-on-Demand-Daemons. Wenn launchctl beim Booten die Job-Plists durchsucht, fordert es launchd auf, alle von diesen Jobs angeforderten Ports zu reservieren und abzuhören. Wenn dies in der plist durch den Schlüssel "OnDemand" angegeben ist, wird der Daemon zu diesem Zeitpunkt nicht tatsächlich geladen. Vielmehr lauscht launchd auf den Port, startet den Daemon bei Bedarf und fährt ihn herunter, wenn er nicht mehr benötigt wird. Nachdem ein Daemon geladen wurde, verfolgt launchd ihn und stellt bei Bedarf sicher, dass er ausgeführt wird. Auf diese Weise ist es wie watchdogd und teilt die Anforderung von watchdogd, dass Prozesse nicht versuchen, sich selbst zu forken oder zu dämonisieren. Wenn ein Prozess in den Hintergrund gerät, verliert launchd den Überblick und versucht, ihn neu zu starten.

Folglich bootet Mac OS X Tiger viel schneller als frühere Versionen. Das System muss lediglich die auszuführenden Daemons registrieren und startet sie erst dann, wenn sie benötigt werden. Tatsächlich ist der Fortschrittsbalken, der während des Bootvorgangs angezeigt wird, nur eine Placebo-Anwendung (mit dem Namen WaitingForLoginWindow), die nichts anderes als den Zeitablauf anzeigt.

Der am schwierigsten zu verwaltende Teil während eines launchd-Boots sind Abhängigkeiten. SystemStarter hatte ein sehr einfaches Abhängigkeitssystem, das die Schlüssel "Uses", "Requires" und "Provides" in der Plist eines Startup-Elements verwendet. Es gibt zwei Hauptstrategien beim Erstellen von launchd-Abhängigkeiten auf Tiger: IPC ermöglicht es Daemons, untereinander zu sprechen, um Abhängigkeiten auszuarbeiten, oder Daemons können Dateien oder Pfade auf Änderungen überprüfen. Die Verwendung von IPC ist viel subtiler als die Tasten des SystemStarters und erfordert mehr Arbeit vom Entwickler, kann jedoch zu saubereren und schnelleren Starts führen. SystemStarter wurde bis OS X Mountain Lion noch unterstützt , wurde aber in OS X Yosemite entfernt .

launchctl

In launchd ist die Steuerung der Dienste in der launchctlAnwendung zentralisiert .

Launchctl kann eigenständig Befehle von der Befehlszeile, von Standard in oder im interaktiven Modus ausführen. Mit Superuser- Berechtigungen kann launchctl verwendet werden, um Änderungen auf globaler Ebene vorzunehmen. Ein Satz von launchctl-Befehlen kann permanent gemacht werden, wenn er in /etc/launchd.conf gespeichert wird . (Eine benutzerspezifische ~/.launchd.conf- Datei scheint in Betracht gezogen worden zu sein, wird aber in keiner vorhandenen Version von macOS unterstützt.)

launchctl kommuniziert mit launchd über einen Mach- spezifischen IPC-Mechanismus.

Objektliste

Eine Eigenschaftsliste (plist) ist ein Dateityp, den launchd für die Programmkonfiguration verwendet. Wenn launchd einen Ordner scannt oder ein Job mit launchctl übergeben wird, liest es eine plist-Datei, die beschreibt, wie das Programm ausgeführt werden soll.

Nachfolgend finden Sie eine Liste häufig verwendeter Tasten. Alle Schlüssel sind optional, sofern nicht anders angegeben. Eine vollständige Liste finden Sie auf der Manpage von Apple für launchd.plist.

Taste Typ Beschreibung
Label Zeichenfolge Der Name des Jobs. Konventionell ist die Auftragsbezeichnung mit dem Namen der plist-Datei identisch , jedoch ohne die Erweiterung .plist . Erforderlich .
Program Zeichenfolge Ein Pfad zu einer ausführbaren Datei. Nützlich für einfache Starts. Mindestens eines von Programoder ProgramArgumentsist erforderlich .
ProgramArguments Reihe von Zeichenfolgen Ein Array von Strings, die einen UNIX-Befehl darstellen. Der erste String ist im Allgemeinen ein Pfad zu einer ausführbaren Datei, während letztere Strings Optionen oder Parameter enthalten. Mindestens eines von Programoder ProgramArgumentsist erforderlich .
UserName String
(standardmäßig rootoder aktueller Benutzer)
Der Job wird als der angegebene Benutzer ausgeführt, der der Benutzer sein kann (oder auch nicht), der ihn an launchd gesendet hat.
OnDemand

(Eingestellt seit 10.5)

Boolean
(standardmäßig YES)
Veraltet ab 10.5 mit der leistungsstärkeren KeepAliveOption. Ein boolesches Flag, das definiert, ob ein Job kontinuierlich ausgeführt wird oder nicht.
RunAtLoad Boolean
(standardmäßig NO)
Ein boolesches Flag, das definiert, ob eine Aufgabe sofort gestartet wird, wenn der Job in launchd geladen wird.
StartOnMount Boolean
(standardmäßig NO)
Ein boolesches Flag, das definiert, ob eine Task gestartet wird, wenn ein neues Dateisystem gemountet wird.
QueueDirectories Reihe von Zeichenfolgen Beobachten Sie ein Verzeichnis für neue Dateien. Das Verzeichnis muss zunächst leer sein und muss in einen leeren Zustand zurückgesetzt werden, bevor QueueDirectoriesseine Aufgabe erneut gestartet wird.
WatchPaths Reihe von Zeichenfolgen Beobachten Sie einen Dateisystempfad auf Änderungen. Kann eine Datei oder ein Ordner sein.
StartInterval Ganze Zahl Plant den Job so, dass er nach einem sich wiederholenden Zeitplan ausgeführt wird. Gibt die Anzahl der Sekunden an, die zwischen den Läufen gewartet werden soll.
StartCalendarInterval Dictionary of Integers
oder
Array of Dictionaries of Integers
Arbeit planen. Die Syntax ähnelt cron .
RootDirectory Zeichenfolge Der Job wird vor der Ausführung in dieses Verzeichnis gechrootet .
WorkingDirectory Zeichenfolge Der Job wird vor der Ausführung in dieses Verzeichnis gespeichert .

StandardInPath,
StandardOutPath,
StandardErrorPath

Zeichenfolge Schlüssel zum Bestimmen von Dateien für die Eingabe und Ausgabe für den gestarteten Prozess.
LowPriorityIO Boolesches Teilt dem Kernel mit, dass diese Aufgabe bei Dateisystem-I/O eine niedrige Priorität hat.
AbandonProcessGroup Boolean
(standardmäßig NO)
Ein boolesches Flag, das definiert, ob Unterprozesse, die von einer von launchd gestarteten Aufgabe gestartet werden, beendet werden, wenn die Aufgabe endet. Nützlich, wenn eine kurzlebige Aufgabe eine langlebige Unteraufgabe startet, aber zu Zombie-Prozessen führen kann .
SessionCreate Boolean
(standardmäßig NO)
Ein boolesches Flag, das definiert, ob eine Sicherheitssitzung für die Aufgabe und ihre Unterprozesse erstellt wird.

Socket-Aktivierungsprotokoll

Der Name jedes Schlüssels unter Sockets wird in der Umgebung des Jobs platziert, wenn er ausgeführt wird, und der Dateideskriptor dieses Sockets wird in dieser Umgebungsvariablen verfügbar sein. Dies unterscheidet sich von der Socket-Aktivierung von systemd dadurch, dass der Name einer Socket-Definition innerhalb der Jobkonfiguration fest in die Anwendung einprogrammiert ist. Dieses Protokoll ist weniger flexibel, obwohl es nicht wie systemd erfordert, dass der Daemon einen Startdateideskriptor festcodiert (ab 2014 ist es 3).

Geschichte

Die Software wurde von Dave Zarzycki bei Apple entworfen und codiert . Das Unternehmen plante, dass alle der folgenden Funktionen in OS X- Umgebungen abgelöst werden:

– und die meisten dieser Dinge wurden abgelöst, als launchd mit Mac OS X 10.4 (Tiger) eingeführt wurde.

Im Jahr 2005 portierte R. Tyler Croy launchd im Rahmen des Google Summer of Code Project auf FreeBSD . Es konnte nicht als PID 1 (nur eine Sitzungsinit) ausgeführt werden und wurde auf dieser Plattform nicht häufig verwendet.

Im Jahr 2006 erwog die Ubuntu- Linux-Distribution die Verwendung von launchd. Die Option wurde abgelehnt, da der Quellcode der Apple Public Source License unterlag – beschrieben als „unvermeidliches Lizenzproblem“. Ubuntu entwickelte stattdessen sein eigenes Service-Management-Tool Upstart und wechselte zu diesem .

Im August 2006 Apple - neu lizenziert launchd unter der Apache - Lizenz, Version 2.0 in dem Bemühen , Annahme von anderem Open - Source - Entwickler zu erleichtern. Die meisten Linux-Distributionen verwenden systemd oder Upstart oder fahren mit init fort , und die BSDs fahren auch mit init fort.

Im Dezember 2013 kündigte R. Tyler Croy seine Absicht an, die Arbeit an seiner Portierung von launchd auf FreeBSD wieder aufzunehmen, und sein "openlaunchd" GitHub-Repo nahm daraufhin zu.

Die letzte Wayback Machine-Erfassung des Mac OS Forge-Bereichs für launchd war im Juni 2012, und die neueste Open-Source-Version von Apple war 842.92.1 im Code für OS X 10.9.5.

Im Jahr 2014 hat Apple mit OS X 10.10 und iOS 8 den Code für launchd in die Closed-Source-Libxpc verschoben.

Im August 2015 kündigten Jordan Hubbard und Kip Macy NextBSD an , das auf dem FreeBSD-CURRENT-Kernel basiert, während Mach IPC, Libdispatch, benachrichtigt, asld, launchd und andere Komponenten hinzugefügt wurden, die von Darwin, Apples Open-Source-Code für OS X, abgeleitet sind.

Apple Open Source Release-Verlauf

Ausführung Lizenz In macOS- Versionen enthalten Enthaltene Apple Developer Tools- Versionen
gestartet 106 Apple Public Source-Lizenz
  • Mac OS X 10.4
  • Mac OS X 10.4.1
gestartet 106.3 Apple Public Source-Lizenz
  • Mac OS X 10.4.2
  • Mac OS X 10.4.3
  • Mac OS X 10.4.4.ppc
  • Mac OS X 10.4.5.ppc
gestartet 106.10 Apple Public Source-Lizenz
  • Mac OS X 10.4.4.x86
  • Mac OS X 10.4.5.x86
gestartet 106.13 Apple Public Source-Lizenz
  • Mac OS X 10.4.6.ppc
  • Mac OS X 10.4.6.x86
gestartet 106.14 Apple Public Source-Lizenz
  • Mac OS X 10.4.7.ppc
  • Mac OS X 10.4.7.x86
  • Mac OS X 10.4.8.ppc
  • Mac OS X 10.4.9.ppc
  • Mac OS X 10.4.10.ppc
  • Mac OS X 10.4.11.ppc
gestartet 106.20 Apple Public Source-Lizenz
  • Mac OS X 10.4.8.x86
  • Mac OS X 10.4.9.x86
  • Mac OS X 10.4.10.x86
  • Mac OS X 10.4.11.x86
  • Entwicklertools 2.4
gestartet 152 Apache-Lizenz 2.0
gestartet 257 Apache-Lizenz 2.0
  • Mac OS X 10.5
  • Mac OS X 10.5.1
  • Entwicklertools 3.1
  • Entwicklertools 3.1b
  • Entwicklertools 3.1.1
  • Entwicklertools 3.1.2
  • Entwicklertools 3.1.3
  • Entwicklertools 3.1.4
gestartet 258.1 Apache-Lizenz 2.0
  • Mac OS X 10.5.2
gestartet 258.12 Apache-Lizenz 2.0
  • Mac OS X 10.5.3
  • Mac OS X 10.5.4
gestartet 258.18 Apache-Lizenz 2.0
  • Mac OS X 10.5.5
gestartet 258.19 Apache-Lizenz 2.0
  • Mac OS X 10.5.6
gestartet 258.22 Apache-Lizenz 2.0
  • Mac OS X 10.5.7
gestartet 258,25 Apache-Lizenz 2.0
  • Mac OS X 10.5.8
gestartet 328 Apache-Lizenz 2.0
  • Mac OS X 10.6
  • Mac OS X 10.6.1
  • Mac OS X 10.6.2
  • Entwicklertools 3.2.1
  • Entwicklertools 3.2.2
  • Entwicklertools 3.2.3
  • Entwicklertools 3.2.4
gestartet 329.3 Apache-Lizenz 2.0
  • Mac OS X 10.6.3
gestartet 329.3.1 Apache-Lizenz 2.0
  • Mac OS X 10.6.4
  • Entwicklertools 3.2.5
  • Entwicklertools 3.2.6
gestartet 329.3.2 Apache-Lizenz 2.0
  • Mac OS X 10.6.5
gestartet 329.3.3 Apache-Lizenz 2.0
  • Mac OS X 10.6.6
  • Mac OS X 10.6.7
  • Mac OS X 10.6.8
gestartet 392.18 Apache-Lizenz 2.0
  • Mac OS X 10.7
  • Mac OS X 10.7.1
gestartet 392.35 Apache-Lizenz 2.0
  • Mac OS X 10.7.2
gestartet 392.36 Apache-Lizenz 2.0
  • Mac OS X 10.7.3
gestartet 392.38 Apache-Lizenz 2.0
  • Mac OS X 10.7.4
gestartet 392.39 Apache-Lizenz 2.0
  • Mac OS X 10.7.5
gestartet 442.21 Apache-Lizenz 2.0
  • Mac OS X 10.8
  • Mac OS X 10.8.1
gestartet 442.26.2 Apache-Lizenz 2.0
  • Mac OS X 10.8.2
  • Mac OS X 10.8.3
  • Mac OS X 10.8.4
  • Mac OS X 10.8.5
gestartet 842.1.4 Apache-Lizenz 2.0
  • OS X 10.9
  • OS X 10.9.1
gestartet 842.90.1 Apache-Lizenz 2.0
  • OS X 10.9.2
  • OS X 10.9.3
gestartet 842.92.1 Apache-Lizenz 2.0
  • OS X 10.9.4
  • OS X 10.9.5

Siehe auch

Verweise

Externe Links

Apple-Entwickler:

Apple-Entwickler-Dokumentenbibliothek im Ruhestand:

Andere Links: