Using launchctl on Mac OSX 10.10 to run a script periodically

June 14, 2015
mac command line

Lately I’ve been playing around with mutt, a “small but powerful text-based email client for Unix operating systems” and offlineimap, a software that downloads your mailbox as a local Maildir.

After I finally got everything set up (easier said than done), I needed a way to make offlineimap synchronize my mailbox periodically. Apple recommends using launchctl instead of crontab. The following example shows how to run offlineimap in quiet mode every two minutes:

<?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.kimgrytoyr.offlineimap.plist</string>
  <key>ProgramArguments</key>
  <array>
    <string>/usr/local/bin/offlineimap</string>
    <string>-u</string>
    <string>quiet</string>
  </array>
  <key>StartInterval</key>
  <integer>120</integer>
</dict>
</plist>

This file is basically an XML file, but the extension you must use is .plist. You would typically call it something like com.yourname.scriptname.plist. Place it in the folder ~/Library/LaunchAgents/, and make sure you replace yourname and scriptname with something relevant.

When you’ve saved the file to the specified location, type the following to load it into launchctl:

launchctl load ~/Library/LaunchAgents/com.yourname.scriptname.plist

If you ever need to remove it from launchctl, you can type the following:

launchctl remove ~/Library/LaunchAgents/com.yourname.scriptname.plist

You can verify that this post was written by me by pasting the signature into keybase.io/verify.