Skip to content

Instantly share code, notes, and snippets.

@florido
Forked from todgru/launchd.md
Created November 4, 2018 11:16
Show Gist options
  • Save florido/f9e16065c53f13466faa47469505d35c to your computer and use it in GitHub Desktop.
Save florido/f9e16065c53f13466faa47469505d35c to your computer and use it in GitHub Desktop.
Launchd and plist, replace cron in Mac OS X

#launchd Usage

I have a bash script called foo.sh that takes one command line argument, bar. I want it to run every 60 seconds and load at startup.

  • an XML plist is Apple Property List
  • com.mydomain.foo.plist Name of launchd plist file should be a reverse fqdn, like (this may not be required, but convention)
  • com.mydomain.foo.plist lives in $HOME/Library/LaunchAgents and is ran as that user.
  • com.mydomain.foo.plist can also live /Library/LaunchDaemons or /Library/LaunchAgents, have requirements, ran as root
  • Load plist with launchctl load com.mydomain.foo.plist
  • Unload plist with lauchctl unload com.mydomain.foo.plist
  • Check /var/log/system.log if you are having issues with plist

from http://developer.apple.com/library/mac/#documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/ScheduledJobs.html

"If the system is turned off or asleep, cron jobs do not execute; they will not run until the next designated time occurs. If you schedule a launchd job by setting the StartCalendarInterval key and the computer is asleep when the job should have run, your job will run when the computer wakes up. However, if the machine is off when the job should have run, the job does not execute until the next designated time occurs."

Example plist for foo.sh

<?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.mydomain.foo</string>

    <key>ProgramArguments</key>
    <array>
      <string>/path/to/foo.sh</string>
      <string>bar</string>
    </array>

    <key>Nice</key>
    <integer>1</integer>

    <key>StartInterval</key>
    <integer>60</integer>

    <key>RunAtLoad</key>
    <true/>

    <key>StandardErrorPath</key>
    <string>/path/to/foo.err</string>

    <key>StandardOutPath</key>
    <string>/path/to/foo.out</string>
  </dict>
</plist>

for reference:

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment