Este contenido no está disponible en el idioma seleccionado.

Chapter 24. Automating System Tasks


You can configure Red Hat Enterprise Linux to automatically run tasks, also known as jobs:

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:

  1. Install the cronie package:

    ~]# yum install cronie
    Copy to Clipboard Toggle word wrap
  2. 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
    Copy to Clipboard Toggle word wrap
  3. Start the crond service for the current session:

    ~]# systemctl start crond.service
    Copy to Clipboard Toggle word wrap
  4. (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:

  1. Choose:

    • in which minutes of an hour to execute the job. For example, use 0,10,20,30,40,50 or 0/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 or 6,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 *

  2. Specify the user. The job will execute as if run by this user. For example, use root.
  3. Specify the command to execute. For example, use /usr/local/bin/my-script.sh
  4. 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
    Copy to Clipboard Toggle word wrap
  5. 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
Copy to Clipboard Toggle word wrap
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:

  1. From the user’s shell, run:

    [bob@localhost ~]$ crontab -e
    Copy to Clipboard Toggle word wrap

    This will start editing of the user’s own crontab file using the editor specified by the VISUAL or EDITOR environment variable.

  2. 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
    Copy to Clipboard Toggle word wrap

    add:

    0,10,20,30,40,50 17-20 15 Jun,Jul,Aug * /home/bob/bin/script.sh
    Copy to Clipboard Toggle word wrap
  3. Save the file and exit the editor.
  4. (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
    Copy to Clipboard Toggle word wrap
Scheduling Hourly, Daily, Weekly, and Monthly Jobs

To schedule an hourly, daily, weekly, or monthly job:

  1. Put the actions you want your job to execute into a shell script.
  2. 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:

  1. Verify that you have the cronie-anacron package installed:

    ~]# rpm -q cronie-anacron
    Copy to Clipboard Toggle word wrap

    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
    Copy to Clipboard Toggle word wrap
  2. 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
    Copy to Clipboard Toggle word wrap
  3. Start the crond service for the current session:

    ~]# systemctl start crond.service
    Copy to Clipboard Toggle word wrap
  4. (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.

Important

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
Copy to Clipboard Toggle word wrap

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

  1. Choose:

    • Frequency of executing the job. For example, use 1 to specify every day or 3 to specify once in 3 days.
    • The delay of executing the job. For example, use 0 to specify no delay or 60 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 the my.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
      Copy to Clipboard Toggle word wrap
  2. 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:

  1. Install the at package:

    ~]# yum install at
    Copy to Clipboard Toggle word wrap
  2. 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
    Copy to Clipboard Toggle word wrap
  3. Start the atd service for the current session:

    ~]# systemctl start atd.service
    Copy to Clipboard Toggle word wrap

24.3.2. Scheduling an At Job

  1. A job is always run by some user. Log in as the desired user and run:

    ~]# at time
    Copy to Clipboard Toggle word wrap

    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
    Copy to Clipboard Toggle word wrap

    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
    Copy to Clipboard Toggle word wrap

    or

    ~]# at 082017
    Copy to Clipboard Toggle word wrap

    To execute the job 5 days from now, run:

    ~]# now + 5 days
    Copy to Clipboard Toggle word wrap
  2. 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>
    Copy to Clipboard Toggle word wrap

    Repeat this step for every command you want to execute.

    Note

    The at> prompt shows which shell it will use:

    warning: commands will be executed using /bin/sh
    Copy to Clipboard Toggle word wrap

    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.

  3. Press Ctrl+D on an empty line to finish specifying the job.
Note

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
Copy to Clipboard Toggle word wrap

Each job is listed on a separate line in the following format:

job_number scheduled_date scheduled_hour job_class user_name
Copy to Clipboard Toggle word wrap

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:

  1. 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
    Copy to Clipboard Toggle word wrap
  2. Find the job you want to delete by its scheduled time and the user.
  3. Run the atrm command, specifying the job by its number:

    ~]# atrm 26
    Copy to Clipboard Toggle word wrap

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 use at or batch, and the at.deny file is ignored.
  • If at.allow does not exist, users listed in at.deny are not allowed to use at or batch.
  • The root user is not affected by the access control files and can always execute the at and batch 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

  1. A job is always run by some user. Log in as the desired user and run:

    ~]# batch
    Copy to Clipboard Toggle word wrap
  2. At the displayed at> prompt, enter the command to execute and press Enter:

    ~]# batch
    at> sh /usr/local/bin/my-script.sh
    Copy to Clipboard Toggle word wrap

    Repeat this step for every command you want to execute.

    Note

    The at> prompt shows which shell it will use:

    warning: commands will be executed using /bin/sh
    Copy to Clipboard Toggle word wrap

    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.

  3. Press Ctrl+D on an empty line to finish specifying the job.
Note

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:

  1. To the /etc/sysconfig/atd file, add this line:

    OPTS='-l x'
    Copy to Clipboard Toggle word wrap

    Substitute x with the new load average. For example:

    OPTS='-l 0.5'
    Copy to Clipboard Toggle word wrap
  2. Restart the atq service:

    # systemctl restart atq
    Copy to Clipboard Toggle word wrap
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:

  1. 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 of Wants= and After= 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
    Copy to Clipboard Toggle word wrap

    If you use this example:

  2. If you want the systemd service to stay active after executing the script, add the RemainAfterExit=yes line to the [Service] section:

    [Service]
    Type=oneshot
    RemainAfterExit=yes
    ExecStart=/usr/local/bin/foobar.sh
    Copy to Clipboard Toggle word wrap
  3. Reload the systemddaemon:

    ~]# systemctl daemon-reload
    Copy to Clipboard Toggle word wrap
  4. Enable the systemd service:

    ~]# systemctl enable one-time.service
    Copy to Clipboard Toggle word wrap
  5. Create the script to execute:

    ~]# cat /usr/local/bin/foobar.sh
    #!/bin/bash
    
    touch /root/test_file
    Copy to Clipboard Toggle word wrap
  6. 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
    Copy to Clipboard Toggle word wrap
  7. Make the script executable:

    ~]# chmod +x /usr/local/bin/foobar.sh
    Copy to Clipboard Toggle word wrap

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.
Volver arriba
Red Hat logoGithubredditYoutubeTwitter

Aprender

Pruebe, compre y venda

Comunidades

Acerca de la documentación de Red Hat

Ayudamos a los usuarios de Red Hat a innovar y alcanzar sus objetivos con nuestros productos y servicios con contenido en el que pueden confiar. Explore nuestras recientes actualizaciones.

Hacer que el código abierto sea más inclusivo

Red Hat se compromete a reemplazar el lenguaje problemático en nuestro código, documentación y propiedades web. Para más detalles, consulte el Blog de Red Hat.

Acerca de Red Hat

Ofrecemos soluciones reforzadas que facilitan a las empresas trabajar en plataformas y entornos, desde el centro de datos central hasta el perímetro de la red.

Theme

© 2025 Red Hat