10.7. Executing Jobs Once
With cron, you can schedule recurring jobs, as we have seen in the previous section. But what if you want to run a certain command just once or a limited number of times, but still at times when it is inconvenient to type in the command interactively? Of course, you could always add the command to the crontab and then remove it later, or pick a date selection that only applies very rarely. But there is also a tool that is made for this job, the at command.
at reads commands to be executed from a file or from standard input. You can specify the time in a number of ways, including natural-language specifications such as noon, midnight, or, interestingly, teatime (which, much to the dismay of British users, maps to 4 p.m.).
For at to work, the at daemon, atd, needs to run. How it is started depends on your distribution: rcatd start and /etc/init.d/atd start are good tries. In a pinch, you should also be able to just run /usr/sbin/atd as root.
As an example, let's say that you want to download a large file from the Internet at midnight when your ISP is cheaper or when you expect the lines to be less congested so that the probability of success is higher. Let's further assume that you need to run a command connectinet for setting up your (dial-up) Internet connection, and disconnectinet for shutting it down. For the actual download in this example, we use the wget command:
tigger$ at midnight warning: commands will be executed using /bin/sh at> connectinet at> wget ftp://overloadedserver.lotsastuff.com/pub/largefiles/reallylargefile.bz2 at> disconnectinet at> <EOT> job 1 at 2005-02-26 00:00
After typing at midnight, the at command first tells us that it is going to execute our commands with another shell (we are using the Z shell for interactive work here, whereas at will be using the Bourne shell) and then lets us enter our commands one after the other. When we are done, we type Ctrl-D, which at shows as <EOT>. at then shows the job number and the exact date and time for the execution. Now you can lean back in confidence that your command will be issued at the specified timejust don't turn off your computer!
If you are unsure which commands you have in the queue, you can check with the atq command:
tigger$ atq 1 2005-02-26 00:00 a kalle
This shows the job number in the first column, then the date of the planned execution, a letter specifying the queue used (here a, you can have more than queue something that is rarely used and that we will not go into here), and finally the owner of the job.
If you decide that it wasn't such a good idea after all to submit that command, you can cancel a job if you know its job numberwhich you now know how to find out using the atq command, in case you have forgotten the output of the at command when you submitted the command in the first place.
Deleting a job from the queue is done using the atrm command. Just specify the job number:
tigger$ atrm 1
atrm is one of the more taciturn commands, but you can always use atq to see whether everything is as expected:
Not much talk, either, but your command is gone.