Chapter 24. Automating System Tasks
You can configure Red Hat Enterprise Linux to automatically run tasks, also known as jobs:
- regularly at specified time using cron, see Section 24.1, “Scheduling a Recurring Job Using Cron”
- asynchronously at certain days using anacron, see Section 24.2, “Scheduling a Recurring Asynchronous Job Using Anacron”
- once at a specific time using at, see Section 24.3, “Scheduling a Job to Run at a Specific Time Using at”
- once when system load average drops to a specified value using batch, see Section 24.4, “Scheduling a Job to Run on System Load Drop Using batch”
- once on the next boot, see Section 24.5, “Scheduling a Job to Run on Next Boot Using a systemd Unit File”
This chapter describes how to perform these tasks.
24.1. Scheduling a Recurring Job Using Cron
Cron
is a service that enables you to schedule running a task, often called a job, at regular times. A cron
job is only executed if the system is running on the scheduled time. For scheduling jobs that can postpone their execution to when the system boots up, so a job is not "lost" if the system is not running, see Section 24.3, “Scheduling a Job to Run at a Specific Time Using at”.
Users specify cron jobs in cron table files, also called crontab
files. These files are then read by the crond
service, which executes the jobs.
24.1.1. Prerequisites for Cron Jobs
Before scheduling a cron
job:
Install the cronie package:
~]# yum install cronie
The
crond
service is enabled - made to start automatically at boot time - upon installation. If you disabled the service, enable it:~]# systemctl enable crond.service
Start the
crond
service for the current session:~]# systemctl start crond.service
(optional) Configure cron. For example, you can change:
- shell to be used when executing jobs
-
the
PATH
environment variable mail addressee if a job sends emails.
See the crontab(5) manual page for information on configuring
cron
.
24.1.2. Scheduling a Cron Job
Scheduling a Job as root User
The root
user uses the cron table in /etc/crontab
, or, preferably, creates a cron table file in /etc/cron.d/
. Use this procedure to schedule a job as root
:
Choose:
-
in which minutes of an hour to execute the job. For example, use
0,10,20,30,40,50
or0/10
to specify every 10 minutes of an hour. -
in which hours of a day to execute the job. For example, use
17-20
to specify time from 17:00 to 20:59. -
in which days of a month to execute the job. For example, use
15
to specify 15th day of a month. -
in which months of a year to execute the job. For example, use
Jun,Jul,Aug
or6,7,8
to specify the summer months of the year. in which days of the week to execute the job. For example, use
*
for the job to execute independently of the day of week.Combine the chosen values into the time specification. The above example values result into this specification:
0,10,20,30,40,50 17-20 15 Jun,Jul,Aug *
-
in which minutes of an hour to execute the job. For example, use
-
Specify the user. The job will execute as if run by this user. For example, use
root
. -
Specify the command to execute. For example, use
/usr/local/bin/my-script.sh
Put the above specifications into a single line:
0,10,20,30,40,50 17-20 15 Jun,Jul,Aug * root /usr/local/bin/my-script.sh
-
Add the resulting line to
/etc/crontab
, or, preferably, create a cron table file in/etc/cron.d/
and add the line there.
The job will now run as scheduled.
For full reference on how to specify a job, see the crontab(5) manual page. For basic information, see the beginning of the /etc/crontab
file:
SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root # For details see man 4 crontabs # Example of job definition: # .---------------- minute (0 - 59) # | .------------- hour (0 - 23) # | | .---------- day of month (1 - 31) # | | | .------- month (1 - 12) OR jan,feb,mar,apr ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed
Scheduling a Job as Non-root User
Non-root users can use the crontab utility to configure cron jobs. The jobs will run as if executed by that user.
To create a cron job as a specific user:
From the user’s shell, run:
[bob@localhost ~]$
crontab -e
This will start editing of the user’s own
crontab
file using the editor specified by theVISUAL
orEDITOR
environment variable.Specify the job in the same way as in the section called “Scheduling a Job as root User”, but leave out the field with user name. For example, instead of adding
0,10,20,30,40,50 17-20 15 Jun,Jul,Aug * bob /home/bob/bin/script.sh
add:
0,10,20,30,40,50 17-20 15 Jun,Jul,Aug * /home/bob/bin/script.sh
- Save the file and exit the editor.
(optional) To verify the new job, list the contents of the current user’s crontab file by running:
[bob@localhost ~]$
crontab -l
@daily /home/bob/bin/script.sh
Scheduling Hourly, Daily, Weekly, and Monthly Jobs
To schedule an hourly, daily, weekly, or monthly job:
- Put the actions you want your job to execute into a shell script.
Put the shell script into one of the following directories:
-
/etc/cron.hourly/
-
/etc/cron.daily/
-
/etc/cron.weekly/
-
/etc/cron.monthly/
-
From now, your script will be executed - the crond
service automatically executes any scripts present in /etc/cron.hourly
, /etc/cron.daily
, /etc/cron.weekly
, and /etc/cron.monthly
directories at their corresponding times.
24.2. Scheduling a Recurring Asynchronous Job Using Anacron
Anacron
, like cron
, is a service that enables you to schedule running a task, often called a job, at regular times. However, anacron
differs from cron
in two ways:
-
If the system is not running at the scheduled time, an
anacron
job is postponed until the system is running; -
An
anacron
job can run once per day at most.
Users specify anacron jobs in anacron table files, also called anacrontab
files. These files are then read by the crond
service, which executes the jobs.
24.2.1. Prerequisites for Anacrob Jobs
Before scheduling an anacron
job:
Verify that you have the cronie-anacron package installed:
~]# rpm -q cronie-anacron
The cronie-anacron is likely to be installed already, because it is a sub-package of the cronie package. If it is not installed, use this command:
~]# yum install cronie-anacron
The
crond
service is enabled - made to start automatically at boot time - upon installation. If you disabled the service, enable it:~]# systemctl enable crond.service
Start the
crond
service for the current session:~]# systemctl start crond.service
(optional) Configure anacron. For example, you can change:
- shell to be used when executing jobs
-
the
PATH
environment variable mail addressee if a job sends emails.
See the anacrontab(5) manual page for information on configuring
anacron
.
By default, the anacron configuration includes a condition that prevents it from running if the computer is not plugged in. This setting ensures that the battery is not drained by running anacron jobs.
If you want to allow anacron to run even if the computer runs on battery power, open the /etc/cron.hourly/0anacron
file and comment out the following part:
# Do not run jobs when on battery power online=1 for psupply in AC ADP0 ; do sysfile="/sys/class/power_supply/$psupply/online" if [ -f $sysfile ] ; then if [ `cat $sysfile 2>/dev/null`x = 1x ]; then online=1 break else online=0 fi fi done
24.2.2. Scheduling an Anacron Job
Scheduling an anacron Job as root User
The root
user uses the anacron table in /etc/anacrontab
. Use the following procedure to schedule a job as root
.
Scheduling an anacron Job as root
User
Choose:
-
Frequency of executing the job. For example, use
1
to specify every day or3
to specify once in 3 days. -
The delay of executing the job. For example, use
0
to specify no delay or60
to specify 1 hour of delay. -
The job identifier, which will be used for logging. For example, use
my.anacron.job
to log the job with themy.anacron.job
string. The command to execute. For example, use
/usr/local/bin/my-script.sh
Combine the chosen values into the job specification. Here is an example specification:
3 60 cron.daily /usr/local/bin/my-script.sh
-
Frequency of executing the job. For example, use
-
Add the resulting line to
/etc/anacrontab
.
The job will now run as scheduled.
For simple job examples, see the /etc/anacrontab
file. For full reference on how to specify a job, see the anacrontab(5) manual page.
Scheduling Hourly, Daily, Weekly, and Monthly Jobs
You can schedule daily, weekly, and monthly jobs with anacron. See the section called “Scheduling Hourly, Daily, Weekly, and Monthly Jobs”.
24.3. Scheduling a Job to Run at a Specific Time Using at
To schedule a one-time task, also called a job, to run once at a specific time, use the at
utility.
Users specify at
jobs using the at utility. The jobs are then executed by the atd
service.
24.3.1. Prerequisites for At Jobs
Before scheduling an at
job:
Install the at package:
~]# yum install at
The
atd
service is enabled - made to start automatically at boot time - upon installation. If you disabled the service, enable it:~]# systemctl enable atd.service
Start the
atd
service for the current session:~]# systemctl start atd.service
24.3.2. Scheduling an At Job
A job is always run by some user. Log in as the desired user and run:
~]# at time
Replace time with the time specification.
For details on specifying time, see the at(1) manual page and the
/usr/share/doc/at/timespec
file.Example 24.1. Specifying Time for At
To execute the job at 15:00, run:
~]# at 15:00
If the specified time has passed, the job is executed at the same time the next day.
To execute the job on August 20 2017, run:
~]# at August 20 2017
or
~]# at 082017
To execute the job 5 days from now, run:
~]# now + 5 days
At the displayed
at>
prompt, enter the command to execute and press Enter:~]# at 15:00 at> sh /usr/local/bin/my-script.sh at>
Repeat this step for every command you want to execute.
NoteThe
at>
prompt shows which shell it will use:warning: commands will be executed using /bin/sh
The at utility uses the shell set in user’s SHELL environment variable, or the user’s login shell, or
/bin/sh
, whichever is found first.- Press Ctrl+D on an empty line to finish specifying the job.
If the set of commands or the script tries to display information to standard output, the output is emailed to the user.
Viewing Pending Jobs
To view the list of pending jobs, use the atq
command:
~]# atq 26 Thu Feb 23 15:00:00 2017 a root 28 Thu Feb 24 17:30:00 2017 a root
Each job is listed on a separate line in the following format:
job_number scheduled_date scheduled_hour job_class user_name
The job_queue
column specifies whether a job is an at
or a batch
job. a
stands for at
, b
stands for batch
.
Non-root users only see their own jobs. The root user sees jobs for all users.
Deleting a Scheduled Job
To delete a scheduled job:
List pending jobs with the
atq
command:~]# atq 26 Thu Feb 23 15:00:00 2017 a root 28 Thu Feb 24 17:30:00 2017 a root
- Find the job you want to delete by its scheduled time and the user.
Run the
atrm
command, specifying the job by its number:~]# atrm 26
24.3.2.1. Controlling Access to At and Batch
You can restrict access to the at
and batch
commands for specific users. To do this, put user names into /etc/at.allow
or /etc/at.deny
according to these rules:
- Both access control files use the same format: one user name on each line.
- No white space is permitted in either file.
-
If the
at.allow
file exists, only users listed in the file are allowed to useat
orbatch
, and theat.deny
file is ignored. -
If
at.allow
does not exist, users listed inat.deny
are not allowed to useat
orbatch
. -
The
root
user is not affected by the access control files and can always execute theat
andbatch
commands.
The at
daemon (atd
) does not have to be restarted if the access control files are modified. The access control files are read each time a user tries to execute the at
or batch
commands.
24.4. Scheduling a Job to Run on System Load Drop Using batch
To schedule a one-time task, also called a job, to run when the system load average drops below the specified value, use the batch
utility. This can be useful for performing resource-demanding tasks or for preventing the system from being idle.
Users specify batch
jobs using the batch utility. The jobs are then executed by the atd
service.
24.4.1. Prerequisites for Batch Jobs
The batch
utility is provided in the at
package, and batch
jobs are managed by the atd
service. Hence, the prerequisites for batch
jobs are the same as for at
jobs. See Section 24.3.1, “Prerequisites for At Jobs”.
24.4.2. Scheduling a Batch Job
A job is always run by some user. Log in as the desired user and run:
~]# batch
At the displayed
at>
prompt, enter the command to execute and press Enter:~]# batch at> sh /usr/local/bin/my-script.sh
Repeat this step for every command you want to execute.
NoteThe
at>
prompt shows which shell it will use:warning: commands will be executed using /bin/sh
The batch utility uses the shell set in user’s SHELL environment variable, or the user’s login shell, or
/bin/sh
, whichever is found first.- Press Ctrl+D on an empty line to finish specifying the job.
If the set of commands or the script tries to display information to standard output, the output is emailed to the user.
Changing the Default System Load Average Limit
By default, batch
jobs start when system load average drops below 0.8. This setting is kept in the atq
service. To change the system load limit:
To the
/etc/sysconfig/atd
file, add this line:OPTS='-l x'
Substitute x with the new load average. For example:
OPTS='-l 0.5'
Restart the
atq
service:# systemctl restart atq
Viewing Pending Jobs
To view the list of pending jobs, use the atq
command. See the section called “Viewing Pending Jobs”.
Deleting a Scheduled Job
To delete a scheduled job, use the atrm
command. See the section called “Deleting a Scheduled Job”.
Controlling Access to Batch
You can also restrict the usage of the batch
utility. This is done for the batch
and at
utilities together. See Section 24.3.2.1, “Controlling Access to At and Batch”.
24.5. Scheduling a Job to Run on Next Boot Using a systemd Unit File
The cron, anacron, at, and batch utilities allow scheduling jobs for specific times or for when system workload reaches a certain level. It is also possible to create a job that will run during the next system boot. This is done by creating a systemd
unit file that specifies the script to run and its dependencies.
To configure a script to run on the next boot:
Create the
systemd
unit file that specifies at which stage of the boot process to run the script. This example shows a unit file with a reasonable set ofWants=
andAfter=
dependencies:~]# cat /etc/systemd/system/one-time.service [Unit] # The script needs to execute after: # network interfaces are configured Wants=network-online.target After=network-online.target # all remote filesystems (NFS/_netdev) are mounted After=remote-fs.target # name (DNS) and user resolution from remote databases (AD/LDAP) are available After=nss-user-lookup.target nss-lookup.target # the system clock has synchronized After=time-sync.target [Service] Type=oneshot ExecStart=/usr/local/bin/foobar.sh [Install] WantedBy=multi-user.target
If you use this example:
-
substitute
/usr/local/bin/foobar.sh
with the name of your script modify the set of
After=
entries if necessaryFor information on specifying the stage of boot, see Section 10.6, “Creating and Modifying systemd Unit Files”.
-
substitute
If you want the
systemd
service to stay active after executing the script, add theRemainAfterExit=yes
line to the[Service]
section:[Service] Type=oneshot RemainAfterExit=yes ExecStart=/usr/local/bin/foobar.sh
Reload the
systemd
daemon:~]# systemctl daemon-reload
Enable the
systemd
service:~]# systemctl enable one-time.service
Create the script to execute:
~]# cat /usr/local/bin/foobar.sh #!/bin/bash touch /root/test_file
If you want the script to run during the next boot only, and not on every boot, add a line that disables the
systemd
unit:#!/bin/bash touch /root/test_file systemctl disable one-time.service
Make the script executable:
~]# chmod +x /usr/local/bin/foobar.sh
24.6. Additional Resources
For more information on automating system tasks on Red Hat Enterprise Linux, see the resources listed below.
Installed Documentation
-
cron - The manual page for the crond daemon documents how
crond
works and how to change its behavior. - crontab - The manual page for the crontab utility provides a complete list of supported options.
-
crontab(5) - This section of the manual page for the crontab utility documents the format of
crontab
files.