Where should a daemon started by launchd store its data?

by GRaAL   Last Updated July 12, 2019 13:12 PM - source

When I develop UI application for OSX I store user's preferences and application config to ~/Library/Preferences/AppName.plist (using NSUserDefaults).

But when I create global background daemon that will be running using launchd on behalf of root - what is the better place to store daemon's config?

On Linux I would put it to the /etc/ directory, but I'm not sure I can do the same on Mac.

Answers 2

For a very safe option, I would write into /usr/local/etc if you wanted to sandbox / persist a configuration file for your daemon.

Also, it’s totally expected that the daemon would simply have the ability to accept command line arguments when launched and you would then store all of these in the preference list that invokes the system. Then relaunch the daemon when the launchd task gets reloaded allows you to change things up on the system as it’s running.

July 12, 2019 11:56 AM

Dynamic Paths

On macOS, a process asks the operating system where to save specific types of files using the NSWorkspace method URLForDirectory:inDomain:appropriateForURL:create:error:. There is a CoreFoundation C equivalent function for this method.

This approach mimics the goals of the XDG Base Directory Specification on other platforms.

Typically /Library, however…

Before macOS 10.15, computer wide processes, such as daemons, used the /Library folder structure:

  • For preferences: /Library/Preferences/
  • For cached files: /Library/Cache/
  • For general support and runtime files: /Library/Application Support/

See What is the purpose of each folder under /Library and /System in Mac OS X? for a good overview of the various folders and their intended purpose.

However, macOS 10.15 changes the file structure and limits large parts of the core system read-only. Shipping with fixed file paths and assuming those paths to have read-write access is risky.

Graham Miln
Graham Miln
July 12, 2019 11:56 AM

Related Questions

What is managing nfsd on OS X?

Updated April 20, 2017 16:12 PM

LaunchDaemon loading but not starting

Updated December 09, 2017 01:12 AM

Running Postgres as Launch Daemon

Updated July 15, 2015 13:05 PM