Cron? Launchd? iCal??

If so, how?

link|improve this question

feedback

migrated from stackoverflow.com Apr 2 '10 at 20:23

This question came from our site for professional and enthusiast programmers.

7 Answers

up vote 9 down vote accepted

For reference, all 3 options would work. The iCal option however has more limitations than the others.

(There are GUIs for editing cron and launchd as mentioned in other answers)

Cron is the most straight forward and well known and there are many tutorials available. The Coles Notes is to add the last line from below to your crontab (either by editing /etc/crontab or using crontab on the command line):

MM HH DD MM WKD -- Minutes, Hour, Day, Month, Weekday (eg. Sun, Mon)
MM HH * * * USERNAME /PATH/TO/SCRIPT
00 3 * * * chealion /myscript.sh "Runs at 03:00 every day"

In Mac OS X, cron has actually been replaced by launchd but launchd is backwards compatible with cron meaning you can still use cron but it's actually launchd doing all the work.

If you want to use launchd you'll want to check out other questions here on Super User as well: (eg. How do I run a launchd command as root?) as to where you want to save your configuration file (the plist file) as when it runs depends on what directory it is stored in and how it's loaded (eg. whether you used sudo or not) - similar to cron.

A sample run daily launchd plist (be sure the file and and the label are the same - minus the plist for the label) follows - this script is run everyday at 3 minutes past midnight:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>local.IDENTIFIER_HERE.SOMETHING</string>
    <key>OnDemand</key>
    <true/>
    <key>RunAtLoad</key>
    <false/>
    <key>UserName</key>
    <string>USERNAME HERE</string>
    <key>Program</key>
    <string>/PATH/TO/SCRIPT</string>
    <key>ProgramArguments</key>
    <array>
        <string>Argument_1</string>
        <string>Argument_2</string>
    </array>
    <key>StartCalendarInterval</key>
    <dict>
        <key>Hour</key>
        <integer>00</integer>
        <key>Minute</key>
        <integer>03</integer>
    </dict>
</dict>
</plist>

It's also worth noting that launchd tasks if they were scheduled for when the computer is asleep or off, they will run when the computer becomes available again (turning it on or waking it up) - though only once no matter how many days it may have been. Edit: I just was at an Apple document that said that if the machine is off, then you will lose any launch events during that time, (your script will not launch on startup), (sleep does launch script on waking up)


Another option is to use "at" (check manual page with "man at"). The script can reschedule itself with e.g.:

echo "sh $0 $@" | at `date +%H:%M` tomorrow

(use "+ 10 minutes" instead of "tomorrow" to run it every 10 minutes; to stop scheduling, just do "at -l" to list the scheduled job ids and then "at -r id" to remove the job)

You may have to start the corresponding daemon (atrun) first with (see http://superuser.com/a/43680):

sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.atrun.plist

Advantages: quick fix, no sudo/root access needed, easy to do complicated schedule patterns Disadvantage: not standard scheduling method for OS X (which is launchd)

link|improve this answer
Sir, for your example launchd configuration file, I could kiss you. But I shan’t. – Paul D. Waite Apr 2 '10 at 22:48
1  
launchd is the way to go under OS X. – zneak Apr 3 '10 at 1:17
Yeah, that was my impression. It does sound like it had some issues back in Tiger, but Apple seem to have sharpened it up since then. – Paul D. Waite Apr 3 '10 at 12:05
feedback
  • For iCal you might want to read this article.
  • You should find enough tutorials for cron if you google for it.

It depends on what you want: iCal scripts will only be executed if you are logged in, cron executes the script without being logged in. I don't know if iCal executes a script if the Mac was turned of at the time the script should have been executed. cron is doing this.

link|improve this answer
feedback

CronniX is a nice GUI frontend for scheduling cron jobs on the mac... Pretty decent if you don't want to go and delve into the cron documentation.

link|improve this answer
feedback

I always use Lingon for this, but it looks like it's out of development. You could try Crontooie, but I've never used it personally. Or just edit the crontab file in the terminal.

link|improve this answer
feedback

There's also this neat thing called AppleScript.

link|improve this answer
Right, but AppleScript doesn’t have any features of its own to get a script to run daily, does it? You’d need iCal or cron or launchd or similar to run whatever AppleScript you wrote. – Paul D. Waite Apr 15 '10 at 13:09
feedback
sp@mactop ~ $ crontab -l
*/5 * * * * /usr/local/bin/cinco.sh
sp@mactop ~ $ cat /usr/local/bin/cinco.sh
#!/bin/sh
....cut....
sp@mactop ~ $ 

...whatever command-lines you throw in for "....cut...." will get run every five minutes.

30 years of progress, and 'cron' is still my favorite scheduler.

-C

link|improve this answer
feedback

Here’s Apple’s guide to the nitty-gritty of writing launchd preference files:

http://developer.apple.com/mac/library/DOCUMENTATION/Darwin/Reference/ManPages/man5/launchd.plist.5.html

link|improve this answer
feedback

Your Answer

 
or
required, but never shown

Not the answer you're looking for? Browse other questions tagged or ask your own question.