Mac OS X contains the handy at command for scheduling commands to run at a later time. at is used to schedule the commands, and the atrun utility is used to execute the jobs. However, by default the atrun utility isn’t enabled, any jobs scheduled via at will never run, with no particular warning. The reason given in the man page for atrun is to “prevent disk access every 10 minutes”, which would be detrimental to laptop battery life and the computer going to sleep.
To enable atrun, execute the following
sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.atrun.plist
Once this is done, you may now use the at command. For example, to schedule a command to run at 11am today, simply type:
[Mac-Book-Pro]$ at 11:30 am today
Then enter the desired command(s) and use Ctrl-D (end of file) to end input
touch diditrun pwd > output.txt job 13 at Sun Dec 20 11:30:00 2009
The example commands above will simply create a 0 length file (diditrun) and output the working directory of the command execution, as simple proof that it indeed has run. You can review the jobs queued using atq (or at -l)
[Mac-Book-Pro]$ atq 13 Sun Dec 20 11:30:00 2009
To review the actual commands to be executed for any particular job (where 13 is the job number listed via atq):
[Mac-Book-Pro]$ at -c 13 #!/bin/sh # atrun uid=501 gid=501 # mail tplatt 0 umask 22 (... much output removed ...) PATH=/Users/tplatt/depot_tools:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin:/usr/X11/bin; export PATH PWD=/Users/tplatt/compression\ testing; export PWD (... more output removed ...) cd /Users/tplatt/compression\ testing || { echo 'Execution directory inaccessible' >&2 exit 1 } OLDPWD=/Users/tplatt; export OLDPWD touch diditrun pwd > output.txt
Notice that the command will be executed in the working directory in which it was scheduled, and with the user credentials of the user who scheduled it.
To remove a job from queue use atrm and the relevant job number
atrm 13
To disable the atrun command from running, you can again manipulate launchd settings via launchctl. You would do this if you were not actively using at and wanted to prevent extraneous disk access and to ensure the computer sleeps properly.
sudo launchctl unload -w /System/Library/LaunchDaemons/com.apple.atrun.plist
Lastly, at is intended for running commands in the future, but only once, not on a recurring basis. For commands you wish to run on a recurring basis, use crontab.