This article has multiple issues. Please helpimprove it or discuss these issues on thetalk page.(Learn how and when to remove these messages) (Learn how and when to remove this message)
|
| launchd | |
|---|---|
| Original author | Dave Zarzycki |
| Developer | Apple Inc. |
| Initial release | April 29, 2005; 20 years ago (2005-04-29) |
| Written in | C |
| Operating system | macOS,FreeBSD,iOS,watchOS |
| Type | Init daemon |
| License | Proprietary software (previouslyAPSL and laterApache License 2.0) |
| Website | opensource |
launchd is aninit andoperating system service managementdaemon created byApple Inc. as part ofmacOS to replace its BSD-styleinit andSystemStarter. There have been efforts toport launchd toFreeBSD and derived systems.
There are two main programs in the launchd system: launchd and launchctl.
launchd manages the daemons at both a system and user level. Similar to xinetd, launchd can start daemons on demand. Similar to watchdogd, launchd can monitor daemons to make sure that they keep running. launchd also has replaced init asPID 1 on macOS and as a result it is responsible for starting the system at boot time.
Configuration files define the parameters of services run by launchd. Stored in the LaunchAgents and LaunchDaemons subdirectories of the Library folders, theproperty list-based files have approximately thirty different keys that can be set. launchd itself has no knowledge of these configuration files or any ability to read them - that is the responsibility of "launchctl".
launchctl is a command line application which talks to launchd usingIPC and knows how to parse theproperty list files used to describe launchd jobs, serializing them using a specialized dictionary protocol that launchd understands. launchctl can be used to load and unload daemons, start and stop launchd controlled jobs, get system utilization statistics for launchd and its child processes, and set environment settings.
Parts of this article (those related to Mention ARM Macs and maybe remove the PowerPC mention since the last PowerPC Mac is 18 years old.) need to beupdated. Please help update this article to reflect recent events or newly available information.(August 2024) |
launchd has two main tasks. The first is toboot the system, and the second is to load and maintain services.
Here is a simplified view of the Mac OS X Tiger system startup on aPowerPC Mac (on anIntel Mac,EFI replacesOpen Firmware andboot.efi replacesBootX):
/etc/rc, various scripts which scan through/System/Library/LaunchDaemons and/Library/LaunchDaemons, calling launchctl on the plists as needed, then launchd starts the login window.In step 4, the startup scripts scan through a few different directories for jobs to run. There are two different directories that are scanned:
These directories are all kept in the typical Library directories of Mac OS X.
launchd is very different from SystemStarter in that it may not actually launch all the daemons at boot time. Key to launchd, and similar to xinetd, is the idea of launch-on-demand daemons. When launchctl scans through the job plists at boot time, it asks launchd to reserve and listen on all of the ports requested by those jobs. If so indicated in the plist by the "OnDemand" key, the daemon is not actually loaded at the time. Rather, launchd will listen on the port, start the daemon when needed, and shut it down when it is no longer needed. After a daemon is loaded, launchd will keep track of it and make sure it is running if needed. In this way it is like watchdogd, and shares watchdogd's requirement that processes do not attempt to fork or daemonize on their own. If a process goes into the background, launchd will lose track of it and attempt to relaunch it.
Mac OS X Tiger, consequently, boots much faster than previous releases. The system only has to register the daemons that are to run and does not actually launch them until they are needed. In fact, the progress bar that appears during boot time is just a placebo application (named WaitingForLoginWindow[1]) that does not really show anything other than the passage of time.
The hardest part to manage during a launchd boot is dependencies. SystemStarter had a very simple system of dependencies that used the "Uses", "Requires", and "Provides" keys in the plist of a startup item. There are two main strategies when creating launchd dependencies on Tiger:IPC allows daemons to talk amongst themselves to work out dependencies, or daemons can watch files or paths for changes. Using IPC is much more subtle than the SystemStarter's keys and requires more work from the developer, but it may[citation needed] lead to cleaner and quicker startups. SystemStarter was still supported up toOS X Mountain Lion, but was removed inOS X Yosemite.
In launchd, control of services is centralized in thelaunchctl application.
On its own, launchctl can take commands from the command line, from standard in, or operate in interactive mode. Withsuperuser privileges, launchctl can be used to make changes on a global scale. A set of launchctl commands can be made permanent when stored in/etc/launchd.conf. (A per-user~/.launchd.conf file appears to have been considered, but is not supported in any existing version of macOS.[2])
launchctl communicates with launchd via aMach-specific IPC mechanism.
Aproperty list (plist) is a type of file that launchd uses for program configuration. When launchd scans a folder, or a job is submitted with launchctl, it reads a plist file that describes how the program is to be run.
A list of often used keys follows below. All keys are optional unless otherwise noted. For a full list, see Apple's manual page forlaunchd.plist.[3]
| Key | Type | Description |
|---|---|---|
Label | String | The name of the job. By convention, the job label is the same as the plist file name, without the.plist extension.Required. |
Program | String | A path to an executable. Useful for simple launches. At least one ofProgram orProgramArguments isrequired. |
ProgramArguments | Array of strings | An array of strings representing a UNIX command. The first string is generally a path to an executable, while latter strings contain options or parameters. At least one ofProgram orProgramArguments isrequired. |
UserName | String (defaults to root or current user) | The job will be run as the given user, who may (or may not) be the user who submitted it to launchd. |
OnDemand(Deprecated since 10.5) | Boolean (defaults to YES) | Deprecated as of 10.5 with the more powerfulKeepAlive option. ABoolean flag that defines if a job runs continuously or not. |
RunAtLoad | Boolean (defaults to NO) | ABoolean flag that defines if a task is launched immediately when the job is loaded into launchd. |
StartOnMount | Boolean (defaults to NO) | ABoolean flag that defines if a task is launched when a new filesystem is mounted. |
QueueDirectories | Array of strings | Watch a directory for new files. The directory must be empty to begin with, and must be returned to an empty state beforeQueueDirectories will launch its task again. |
WatchPaths | Array of strings | Watch a filesystem path for changes. Can be a file or folder. |
StartInterval | Integer | Schedules job to run on a repeating schedule. Indicates number of seconds to wait between runs. |
StartCalendarInterval | Dictionary of integers or Array of dictionaries of integers | Job scheduling. Thesyntax is similar tocron. |
RootDirectory | String | The job will bechrooted into this directory before execution. |
WorkingDirectory | String | The job will bechdired into this directory before execution. |
| String | Keys to determine files for input and output for the launched process. |
LowPriorityIO | Boolean | Tells the kernel that this task is of a low priority when doing filesystem I/O. |
AbandonProcessGroup | Boolean (defaults to NO) | ABoolean flag that defines whether subprocesses launched from a task launched by launchd will be killed when the task ends. Useful where a short-lived task starts a long-lived subtask, but may result inzombie processes. |
SessionCreate | Boolean (defaults to NO) | ABoolean flag that defines whether a security session will be created for the task and its subprocesses. |
The name of each key under Sockets will be placed into the environment of the job when it is run, and the file descriptor of that socket will be available in that environment variable. This differs from systemd's socket activation in that the name of a socket definition inside of the job configuration is hardcoded into the application. This protocol is less flexible, although it does not, as systemd does, require the daemon to hardcode a starting file descriptor (as of 2014, it is 3).[4]
The software was designed and coded by Dave Zarzycki atApple. The company planned for all of the following to be superseded inOS X environments –
– and most of those thingswere superseded when launchd was introduced withMac OS X v10.4 (Tiger).
In 2005, R. Tyler Croy ported launchd toFreeBSD as part of Google Summer of Code Project. It could not be run as PID 1 (only a session init), and it was not commonly used on that platform.[5]
In 2006, theUbuntuLinux distribution considered using launchd. The option was rejected because the source code was subject to theApple Public Source License – described as an "inescapable licence problem".[6] Ubuntu instead developed and switched to its own service management tool,Upstart.
In August 2006, Applerelicensed launchd under theApache License, Version 2.0 in an effort to make adoption by other open source developers easier.[7] Most Linux distributions usesystemd orUpstart, or continue withinit, and theBSDs also continue with init.
In December 2013, R. Tyler Croy announced his intent to resume work on his port of launchd to FreeBSD, and his "openlaunchd" GitHub repo subsequently rose in activity.[8]
The last Wayback Machine capture of the Mac OS Forge area for launchd was in June 2012,[9] and the most recent open source version from Apple was842.92.1 in code for OS X 10.9.5.
In 2014, with OS X 10.10 and iOS 8, Apple moved code for launchd to closed source libxpc.[10]
In August 2015 Jordan Hubbard and Kip Macy announcedNextBSD, which is based on FreeBSD-CURRENT kernel while adding in Mach IPC, Libdispatch, notifyd, asld, launchd, and other components derived from Darwin, Apple's open-source code for OS X.
launchd.plist(5) – Darwin andmacOS File FormatsManual… 10.10: moved to libxpc 559 (560 in iOS 8) – Source not available yet – and may not ever be – Libxpc is a closed source project …
Apple Developer:
Apple Developer Retired Documents Library:
launchd(8): System wide daemon and per-user agent manager – Darwin andmacOS System Manager'sManuallaunchd.conf(5) – Darwin andmacOS File FormatsManuallaunchd.plist(5) – Darwin andmacOS File FormatsManuallaunchctl(1) – Darwin andmacOS General CommandsManualOther links: