Lesson 6.1: Schedule tasks using at and cron


  • | | | | | +--- Command
  • | | | | +----- Day of the week (0 - 7) (Sunday is 0 or 7)
  • | | | +------- Month (1 - 12)
  • | | +--------- Day of the month (1 - 31)
  • | +----------- Hour (0 - 23)
  • +------------- Minute (0 - 59)

Type of Jobs

  • One Time Job : at
  • Repeated Job : cron

Process to at

  • Check if package installed and service started
[root@sanjeeb html]# rpm -q at 
at-3.1.23-11.el9.aarch64
 
[root@sanjeeb html]# systemctl status atd
 atd.service - Deferred execution scheduler
     Loaded: loaded (/usr/lib/systemd/system/atd.service; enabled; preset: enabled)
     Active: active (running) since Wed 2024-09-25 20:38:46 +0545; 42min ago
       Docs: man:atd(8)
   Main PID: 1320 (atd)
      Tasks: 1 (limit: 22585)
     Memory: 332.0K
        CPU: 2ms
     CGroup: /system.slice/atd.service
             └─1320 /usr/sbin/atd -f
  • Time Format of at jobs (12 Hour Format : at 12 am) & (24 Hour Format : at 00:00)

Examples of at

  • at 5pm Friday
  • at 19:01 December 21 2028
  • at 19:00 December 30
  • at now +5 minutes

If no output is given in the command then the output will be displayed at mail

[root@sanjeeb ~]# at now +1 minutes  
warning: commands will be executed using /bin/sh
at> whoami
at> <EOT>   # Press Ctrl+D to End
job 7 at Wed Sep 25 21:27:00 2024

atq Examples

[sanjeeb@sanjeeb ~]$ at 08:49 am September 26 2024
warning: commands will be executed using /bin/sh
at> echo "This will be printed after 2 minutes "
at> echo "saved to file " >/home/sanjeeb/print_file
at> q
at> <EOT>
job 14 at Thu Sep 26 08:49:00 2024
 
[sanjeeb@sanjeeb ~]$ atq
14	Thu Sep 26 08:49:00 2024 a sanjeeb
 
# Now you can see the mail 
[sanjeeb@sanjeeb ~]$ mail
s-nail version v14.9.22.  Type ? for help
/var/spool/mail/sanjeeb: 4 messages 1 new
    1 Sanjeeb KC            2024-09-26 08:12   15/574   "Output from your job       10 "
    2 Sanjeeb KC            2024-09-26 08:15   22/932   "Output from your job       11 "
    3 Sanjeeb KC            2024-09-26 08:37   15/547   "Output from your job       13 "
▸N  4 Sanjeeb KC            2024-09-26 08:49   15/592   "Output from your job       14 "
& 4
[-- Message  4 -- 15 lines, 592 bytes --]:
Subject: Output from your job 14
To: sanjeeb@sanjeeb.localdomain
Message-Id: <20240926030400.14BE11165E4E@sanjeeb.localdomain>
Date: Thu, 26 Sep 2024 08:49:00 +0545 (+0545)
From: Sanjeeb KC <sanjeeb@sanjeeb.localdomain>
# Output 1 
This will be printed after 2 minutes 
# Output 2 , The output is saved in print_file 
[sanjeeb@sanjeeb ~]$ cat print_file
saved to file 

To check the status of the at list

[root@sanjeeb ~]# atq
7	Wed Sep 25 21:27:00 2024 a root 

Mail service

# Install Postfix service 
[root@sanjeeb ~]# rpm -q postfix 
[root@sanjeeb ~]# yum -y install postfix 
 
# Also install s-nail
[root@sanjeeb ~]# yum -y install s-nail 
 
# Check the status of postfix service 
[root@sanjeeb ~]# systemctl status postfix.service 
# If not started then start and enable 
[root@sanjeeb ~]# systemctl start postfix.service 
[root@sanjeeb ~]# systemctl enable postfix.service 
 
# Use the following command to view the mails
[sanjeeb@sanjeeb ~]$ mail
s-nail version v14.9.22.  Type ? for help
/var/spool/mail/sanjeeb: 3 messages
   1 Sanjeeb KC            2024-09-26 08:12   15/574   "Output from your job       10 "
    2 Sanjeeb KC            2024-09-26 08:15   22/932   "Output from your job       11 "
    3 Sanjeeb KC            2024-09-26 08:37   15/547   "Output from your job       13 "
 
# Use the numbers to select the mail &1, &2, &3 etc. 
# Press q to quit 

To check what the command is for scheduled job using atq

# File path
[sanjeeb@sanjeeb at]$ pwd
/var/spool/at
# List of tasks
[sanjeeb@sanjeeb at]$ ls
a0000f01b747e1  a0001001b747ff  a0001101b7483b  spool
# View the task
[sanjeeb@sanjeeb at]$ cat a0000f01b747e1  

To remove a task from schedule atrm

[sanjeeb@sanjeeb at]$ atq 
15	Thu Sep 26 09:30:00 2024 a sanjeeb
16	Thu Sep 26 10:00:00 2024 a sanjeeb
17	Thu Sep 26 11:00:00 2024 a sanjeeb
 
# Removing 15 number task
[sanjeeb@sanjeeb at]$ atrm 15
 
[sanjeeb@sanjeeb at]$ atq
16	Thu Sep 26 10:00:00 2024 a sanjeeb
17	Thu Sep 26 11:00:00 2024 a sanjeeb

Schedule Cron Jobs

Initialization

# Check if package exits
[root@sanjeeb ~]# rpm -q cronie
cronie-1.5.7-10.el9.aarch64
 
# Status of crond
[root@sanjeeb ~]# systemctl status crond
 crond.service - Command Scheduler
     Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled; preset: enabled)
     Active: active (running) since Wed 2024-09-25 20:38:46 +0545; 12h ago
   Main PID: 1367 (crond)
      Tasks: 1 (limit: 22585)
     Memory: 864.0K
        CPU: 198ms
     CGroup: /system.slice/crond.service
             └─1367 /usr/sbin/crond -n
 
Sep 25 21:01:01 sanjeeb run-parts[6708]: (/etc/cron.hourly) starting 0anacron
Sep 26 08:01:33 sanjeeb CROND[38657]: (root) CMD (run-parts /etc/cron.hourly)
Sep 26 08:01:33 sanjeeb anacron[38668]: Anacron started on 2024-09-26
Sep 26 08:01:33 sanjeeb anacron[38668]: Will run job `cron.daily' in 7 min.
Sep 26 08:01:33 sanjeeb anacron[38668]: Jobs will be executed sequentially
Sep 26 08:08:33 sanjeeb anacron[38668]: Job `cron.daily' started
Sep 26 08:08:33 sanjeeb anacron[38668]: Job `cron.daily' terminated
Sep 26 08:08:33 sanjeeb anacron[38668]: Normal exit (1 job run)
Sep 26 09:01:01 sanjeeb CROND[41406]: (root) CMD (run-parts /etc/cron.hourly)
Sep 26 09:01:01 sanjeeb CROND[41405]: (root) CMDEND (run-parts /etc/cron.hourly)

Format of cron table

  • Min Hr DoM M DoW < command script >
  • Min : 00-59
  • Hr : 00-23
  • DoM : 1-31
  • M : 1-12 (1-Jan, 2-Feb)
  • DoW : 0-6 (0-Sun, 1-Mon ...)

Examples of cron

# Everyday run a command at 9:00am to check who has logged into the server (00  9   *   *   *  who)
# To view the free memory at every hour (00   *   *   *   *     free -h)
# To view the free memory at every minutes (*  *   *   *   *    free -h)
# Run a script in every 15 minutes (*/15    *   *   *  *     myscript.sh)
# Every month first week morning 9:30 (30   09   01    *    *   myscript.sh)
# To run a script in specific hours (00   9,12,15,17,20   *   *     *   myscript.sh)
# To run a script in specific range (00   9-12   *   *  *  myscript.sh)
# To run a quaterly job(3months) at 5:00pm (00  17   */3    *   *   myscript.sh)
# Every 31st December at evening 5:30  (30  17  31  12  *   myscript.sh)
# Weekly backup at friday 12 oclock (00     00    *     *   5   script.sh)
# Backup in business days   (00     00      *   *   1-5     script.sh)

Task schedule command

# vi editor will open
[root@sanjeeb ~]# crontab -e 
 
# Write the tasks 
*/2	*	*	*	*	echo "Running every 2 Mins"
*	*	*	*	*	df -h >>/root/dfout_cron
 
# To view the tasks 
[root@sanjeeb ~]# crontab -l 
*/2	*	*	*	*	echo "Running every 2 Mins"
*	*	*	*	*	df -h >>/root/dfout_cron
 
# To remove the entire cron table 
[root@sanjeeb ~]# crontab -r 

To deny someone to use cron

# Add the users in this file 
[root@sanjeeb etc]# vim /etc/cron.deny 
 
[ribik@sanjeeb ~]$ crontab -e 
You (ribik) are not allowed to use this program (crontab)
See crontab(1) for more information

To allow only users to use cron

# Add the users in this file 
[root@sanjeeb etc]# vim /etc/cron.allow 
All systems normal

© 2025 2023 Sanjeeb KC. All rights reserved.