Cron

From Cheaha
Revision as of 13:55, 16 March 2021 by Clint93@uab.edu (talk | contribs)
Jump to navigation Jump to search


Attention: Research Computing Documentation has Moved
https://docs.rc.uab.edu/


Please use the new documentation url https://docs.rc.uab.edu/ for all Research Computing documentation needs.


As a result of this move, we have deprecated use of this wiki for documentation. We are providing read-only access to the content to facilitate migration of bookmarks and to serve as an historical record. All content updates should be made at the new documentation site. The original wiki will not receive further updates.

Thank you,

The Research Computing Team

Cron

What Is Cron?

Cron is a unix time based job scheduler tool used to schedule command execution at a specified time interval. These jobs are referred to as cronjobs, and are a great way of automating tasks or scripts so that they can be executed at a specific time.

Overview

A crontab file houses instructions to the cron daemon of the basic form: "run this command at this time on this date". Each user can have their own crontab file.

Crontab Syntax

crontab [ -u user ] file
crontab [ -u user ] { -l | -r | -e }
crontab [ -u user ] [ -i ] { -e | -l | -r }
crontab [ -u user ] [ -l | -r | -e ] [-i] [-s]

Cron Expression Table

Cron actions are driven by a crontab file, also known as a "cron table". The user's crontab file is a configuration file that specifies shell commands to run at a given schedule.

Every crontab file consists of two parts: a schedule and a command. Here is a look into the scheduling syntax:

# ┌───────────── minute (0 - 59)
# │ ┌───────────── hour (0 - 23)
# │ │ ┌───────────── day of the month (1 - 31)
# │ │ │ ┌───────────── month (1 - 12)
# │ │ │ │ ┌───────────── day of the week (0 - 6) (Sunday to Saturday;
# │ │ │ │ │                                   7 is also Sunday on some systems)
# │ │ │ │ │
# │ │ │ │ │
# * * * * * <command to execute>

A crontab file has five fields; each field is represented by an asterisk to determine the data and time of a certain task.

Crontab Characters

Asterisk (*) - defines all the scheduling parameters.

Comma (,) - maintains two or more execution times of a single command.

Hyphen (-) - determines the range of time when setting several execution times of a single command.

Slash (/) - creates predetermined intervals of time in a specific range.

Last (L) - determines the last day of the week given in. a month. Example: 4L means the last Thursday.

Weekday (W) - determines the day of the week, followed by a number ranging from 1 to 5. Example: 1#2 means the second Monday

Question mark (?) - to leave blank

Crontab Options

To install, update, or edit a job in crontab, use the -e option.

$ crontab -e

To list crontab entires, use the -l option

$ crontab -l

To remove ALL jobs from crontab, use the -r option

$ crontab -r

To remove confirm removing a job from crontab, use the -i option

$ crontab -i -r

To add SELINUX security to a crontab file,

$ crontab -s

To edit another user's crontab file, use the user -u option and specify the username

$ crontab -u username -e

To list other user crontab entries

$ crontab -u username -l

NOTE: By default, cron uses vim to edit the crontab file. If you're not familiar with Vi/Vim, use the following command in Cheaha to go through a brief tutorial:

$ vimtutor

Examples

Bash Script (cronjob.sh) To Build Environment (via Singularity) & Run Python Script

#!/bin/bash
#
#SBATCH --job-name=dtn-cronjob
#
# Number of tasks needed for this job. Generally, used with MPI jobs
#SBATCH --ntasks=1
#SBATCH --partition=short
#
# Time format = HH:MM:SS, DD-HH:MM:SS
#SBATCH --time=3:30:00
#
# Number of CPUs allocated to each task. 
#SBATCH --cpus-per-task=1
#
# Mimimum memory required per allocated  CPU  in  MegaBytes. 
#SBATCH --mem-per-cpu=1000
#
# Send mail to the email address when the job fails
#SBATCH --mail-type=FAIL
#SBATCH --mail-user=YOUR_EMAIL_ADDRESS

#Set your environment here
export PATH="`cat path`:$PATH"
module load Singularity
# execute python code
CLIENT=$1
TOKEN=$2
singularity exec -B . dtn_image_latest.sif python generate_data.py $CLIENT /datasets/ $PWD/../TEST_TRANSFERS/ -l 01 04 06 12 -t $TOKEN -r /perftest/uab_rc/ -wc
[ ! -d "./data" ] && mkdir ./data
mv ./*.csv ./data/

Bash Script to Run cronjob.sh Every 4 Hours Every Day


#!/bin/bash

# resources 
#SBATCH cpus-per-task=1
#SBATCH mem-per-cpu=4G
#SBATCH array=-1%1
#SBATCH partition=express

# job name, error and output files
#SBATCH --job-name=cron-job
#SBATCH error=err_%j_4a.log
#SBATCH output=out_%j_%4a.log
#SBATCH ntasks=1

# email address to request notifications when the job is complete or if it fails
#SBATCH --mail-type=FAIL
#SBATCH --mail-user=$USER@uab.edu

module load Singularity
singularity pull docker://mmoo97/dtn_image:latest
# Build crontab
sbatch_dir=$(which sbatch)
echo "#!/usr/bin/bash

MAILTO=$USER@uab.edu

# runs cronjob.sh every 4 hours every day
00 */4 * * * cd $USER_DATA/DTN_tests && $sbatch_dir $USER_DATA/DTN_tests/cronjob.sh $CLIENT $TOKEN" > dtn-crontab
echo $PATH > path

The first line in the cron configuration file (crontab file) is the shebang. When this file is executed, if the file content beings with #!, the kernel executes the file specified on the #! line and passes the original file as an argument. Essentially, the shebang tells the terminal which program to use to run your scripts if your script is an executable file.

#!/usr/bin/env