Configuring cron on Mac OS X Server 10.5.x and later
Last modified: October 26, 2009 - 00:11
Drupal documentation refers to running cron jobs periodically. But OS X Server (at least Leopard Server) has a kernel bug that results in a log message from cron jobs to the effect “Could not setup Mach task special port 9: (os/kern) no access”. Not a joyful message to come across, though it appears to be harmless.
In addition, OS X doesn’t come with wget, so the suggested cron call in the Drupal docs doesn’t work anyhow.
To avoid both of these problems, put a call to curl in a launchd daemon .plist file (e.g. /Library/LaunchDaemons/drupal-cron-call.plist), thusly:
<?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.{domain-name}.drupal-cron</string>
<key>UserName</key>
<string>nobody</string>
<key>GroupName</key>
<string>_www</string>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/curl</string>
<string>-s</string>
<string>http://localhost/{drupal-subdirectory/}cron.php</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>StartCalendarInterval</key>
<dict>
<key>Minute</key>
<integer>09</integer>
</dict>
</dict>
</plist>Then launchctl load /Library/LaunchDaemons/drupal-cron-call.plist and enjoy.
Notes:
- “http://localhost/{drupal-subdirectory/}cron.php” might be replaced with “http://{domain-name}/cron.php” for a production server.
- Be sure to replace {domain-name} and/or {drupal-subdirectory/} placeholders (in sample .plist file above) with appropriate values.
- For non-production environments, StartCalendarInterval, which always runs at nine minutes past the hour in this example, should perhaps be replaced with StartInterval, which always runs after a specified number of seconds have elapsed (since the last run). For production environments, it’s nice to run cron by the clock, but development computers may be asleep during arbitrary times and thus benefit from the elapsed-time approach. To change this, replace:
<key>StartCalendarInterval</key>
<dict>
<key>Minute</key>
<integer>09</integer>
</dict>
with:
(This example runs every hour.)<key>StartInterval</key>
<integer>3600</integer>

Works on OS X 10.4.x
Awesome! This also works on my client machine running OS X 10.4.11. This should work on any Mac using OS X 10.4+. I was able to get it running for my Multi-Site setup, using my cronall script. Look for my comment on http://drupal.org/node/246091, if you're interested.
One alteration was necessary though. You have to change the GroupName to www, instead of _www. I'm not sure if this is a 10.4 -> 10.5 change, or if it's a Client vs Server variation.
Apple's documentation for OS X 10.6 Server claims that the user and group are www, instead of _www, so it could just be an error in the above code.
Michael
Martian Graphix, Inc