Книга: Fedora™ Unleashed, 2008 edition
Using at and batch to Schedule Tasks for Later
Using at
and batch
to Schedule Tasks for Later
If there is a time-intensive task you want to run, but you do not want to do it while you are still logged in, you can tell Fedora to run it later with the at
command. To use at
, you need to tell it the time at which you want to run and then press Enter. You then see a new prompt that starts with at>
, and everything you type there — until you press Ctrl+D — comprises the commands you want at
to run.
When the designated time arrives, at
performs each action individually and in order, which means later commands can rely on the results of earlier commands. In this next example, run at just after 5 p.m., at is used to download and extract the latest Linux kernel at a time when the network should be quiet:
[paul@caitlin ~]$ at now + 7 hours
at> wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.10.tar.bz2
at> tar xvfjp linux-2.6.10.tar.bz2
at> <EOT>
job 2 at 2005-01-09 17:01
Specifying now + 7 hours
as the time does what you would expect: at
was run at 5 p.m., so the command runs just after midnight that night. When your job finishes, at
sends you mail with a full log of your job's output; type mail
at the console to bring up your mailbox and then press the relevant number to read at's
mail.
If you have a more complex job, you can use the -f
parameter to have at
read its commands from a file, like this:
echo wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.10.tar.bz2;
tar xvfjp linux-2.6.10.tar.bz2 > myjob.job
at -f myjob.job tomorrow
As you can see, at
is flexible about the time format it takes; you can specify it in three ways:
? Using the now
parameter, you can specify a number of minutes, hours, days, or weeks relative to the current time — for example, now + 4 weeks
would run the command one month from today.
? You can also specify several special times, including tomorrow
, midnight
, noon
, or teatime
(4 p.m.). If you do not specify a time with tomorrow
, your job is set for precisely 24 hours from the current time.
? You can specify an exact date and time using HH:MM MM/DD/YY
format — for example, 16:40 22/12/05 for 4:40 p.m. on the 22nd of December 2005.
When your job is submitted, at reports the job number, date, and time that the job will be executed; the queue identifier; plus the job owner (you). It also captures all your environment variables and stores them along with the job so that, when your job runs, it can restore the variables, preserving your execution environment.
The job number and job queue identifier are both important. When you schedule a job using at, it is placed into queue a by default, which means it runs at your specified time and takes up a normal amount of resources.
There is an alternative command, batch
, which is really just a shell script that calls at
with a few extra options. These options (-q b -m now
, if you were interested) set at
to run on queue b (-q b
), mailing the user on completion (-m
), and running immediately (now
). The queue part is what is important: Jobs scheduled on queue b are executed only when the system load falls below 0.8 — that is, when the system is not running at full load. Furthermore, they run with a lower niceness, meaning queue a jobs usually have a niceness of 2, whereas queue b jobs have a niceness of 4.
Because batch
always specifies now
as its time, you need not specify your own time; it simply runs as soon as the system is quiet. Having a default niceness of 4 means that batched commands get fewer system resources than queue jobs (at's
default) and fewer system resources than most other programs. You can optionally specify other queues using at.
Queue c runs at niceness 6, queue d runs at niceness 8, and so on. However, it is important to note that the system load is checked only before the command is run. If the load is lower than 0.8, your batch job is run. If the system load subsequently rises beyond 0.8, your batch job continues to run, albeit in the background, thanks to its niceness value.
When you submit a job for execution, you are also returned a job number. If you forget this or just want to see a list of other jobs you have scheduled to run later, use the atq
command with no parameters. If you run this as a normal user, it prints only your jobs; running it as a super-user prints everyone's jobs. The output is in the same format as when you submit a job, so you get the ID number, execution time, queue ID, and owner of each job.
If you want to delete a job, use the atrm
command followed by the ID number of the job you want to delete. The next example shows atq
and atrm
being used to list jobs and delete one:
[paul@caitlin ~]$ atq
14 2005-01-20 23:33 a paul
16 2005-02-03 22:34 a paul
17 2005-01-25 22:34 a paul
15 2005-01-22 04:34 a paul
18 2005-01-22 01:35 b paul
[paul@caitlin ~]$ atrm 16
[paul@caitlin ~]$ atq
14 2005-01-20 23:33 a paul
17 2005-01-25 22:34 a paul
15 2005-01-22 04:34 a paul
18 2005-01-22 01:35 b paul
In that example, job 16 is deleted by atrm
, and so it does not show up in the second call to atq
.
The default configuration for at
and batch
is to allow everyone to use it, which is not always the desired behavior. Access is controlled through two files: /etc/at.allow
, and /etc/at.deny
. By default, at.deny
exists but is empty, which allows everyone to use at
and batch.
You can enter usernames into at.deny
, one per line, to stop those users scheduling jobs.
Alternatively, you can use the at.allow
file; this does not exist by default. If you have a blank at.allow
file, no one except root is allowed to schedule jobs. As with at.deny
, you can add usernames to at.allow
one per line, and those users can schedule jobs. You should use either at.deny
or at.allow
: When someone tries to run at
or batch
, Fedora checks for the username in at.allow
. If it is in there, or if at.allow
does not exist, Fedora checks for the username in at.deny
. If the username is in at.deny
or at.deny
does not exist, the user is not allowed to schedule jobs.
- Forced writes - палка о двух концах
- Forced Writes
- Разработка приложений баз данных InterBase на Borland Delphi
- Open Source Insight and Discussion
- Introduction to Microprocessors and Microcontrollers
- Chapter 6. Traversing of tables and chains
- Chapter 8. Saving and restoring large rule-sets
- Chapter 11. Iptables targets and jumps
- Chapter 5 Installing and Configuring VirtualCenter 2.0
- Chapter 15. Graphical User Interfaces for Iptables
- Chapter 16. Commercial products based on Linux, iptables and netfilter
- Appendix A. Detailed explanations of special commands