If you're an old-school Unix or Linux person, you're probably also used to the SysV system initialization routine. Nowadays, it's slowly being replaced by upstart and the likes, but I'm going to skip that for now. This is meant as a guide for ye olde Unix neckbeards.
Basically, SysV init means:
OS X does this differently, and superficially, much simpler.
When the system boots, the launchd process is responsible for starting all daemons. To sum up the characteristics of this method:
There is a further distinction which I haven't talked about. OS X has the concept of user-specific daemons. These are called "launch agents" instead of daemons and they have their configuration files in /System/Library/LaunchAgents, and other locations specified in the launchd man page. Examples of these launch agents: the dock and software for your Wacom tablet.
The stuff below is equivalent to listing the contents of the /etc/init.d directory on Linux.
To see what system daemons are present on the system;
$ cd /System/Library/LaunchDaemons $ ls
Note that this does not tell you whether they've actually been configured to start, or not!
The stuff below is equivalent to listing the contents of the /etc/rcX.d directories on Linux, or using the "chkconfig --list" command on RedHat.
Since launchd is more than just managing daemons, but also a replacement for init, it can show us some bookkeeping on previously run daemons. Use launchctl its 'list' parameter to list the currently running daemons, including the daemons that have already exited (i.e. configured for a one-time run).
To list all daemons:
$ launchctl list
To show daemons, but filter out those that aren't currently running:
$ launchctl list | grep -v "^-"
The stuff below is equivalent to using the scripts in /etc/init.d on Linux.
To temporarily stop a daemon, you use the unload parameter plus the config filename. For instance to stop the daemon that controls swapping memory to disk:
$ sudo launchctl unload /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist
If it says "nothing to unload", then the daemon wasn't configured to be started in the first place.
To temporarily start a daemon, use the load parameter:
$ sudo launchctl unload /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist
The stuff below is equivalent to using the chkconfig or update-rc.d commands in Linux.
To start or stop a daemon, and make sure it'll be started the next boot, use the -w flag. For example: to start the dynamic pager now, and after rebooting:
$ sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist
If the daemon wasn't configured to start before, you might want to pass the -F flag, which forces starting.
The stuff below is equivalent to editing a script in /etc/init.d, or a configuration file in /etc under linux.
To configure the start/stop flags of a daemon, you edit the plist file with the defaults command. To read the current configuration:
$ defaults read /System/Library/LaunchDaemons/com.apple.dynamic_pager.plist
To change a config file, simply use the defaults 'write' parameter. As an example, to disable Bonjour advertising on the network:
$ sudo defaults write /System/Library/LaunchDaemons/com.apple.mDNSResponder \ ProgramArguments -array-add "-NoMulticastAdvertisements"
Note that whenever software is updated, these changes get written over! OS X does not have a package system to my knowledge, which will save any adjusted configuration files.
Some notes: