Sometimes you may need to run a job regularly. For example, you must run an analysis program on the data collected daily. This means you need to set a reminder to repeat the same at the end of every day. Slurm allows users to schedule recurring jobs through scrontab.
scrontab file can contain comments starting with '#', whitespaces, valid crontab entries or custom variable settings.
Lines that start with
#SCRON are treated like the beginning of a new batch job, and work like
#SBATCH directives for batch jobs. They allow options to be defined for the single following crontab entry.
scrontab command is the main entry of the file. It defines the interval to run the sheduled reccuring job. The format of the
scrontab command looks like the following.
m h dom mon dof command, where,
mrepresents the minute [0-59].
hrepresents the hour [0-23].
domrepresents the day of month [1-31].
monrepresents the month [1-12] (or name).
dofrepresents day of week [0-7] (0 and 7 are Sunday, or use name).
commandrepresents the reccuring job.
5 20 * * * command1 runs command1 everyday at
8:05pm. Note the asterisk
* which means that it’s valid for each of the allowed values for the given time period. To run the same commad every Monday at midnight you may type,
0 0 * * 1 command1. Note that the value for minute and hour is 0 to make sure that the command runs once on Monday.
If you have a command that you need to run every Monday and Friday, you can use a comma operator to specify multiple values as shown bellow.
0 0 * * 1,6 command1
To run a job at every specfic interval, you can use the forward slash operator
/. For example to run command1 every three days, type:
0 0 */3 * * command1
scrontab allows you to use shortcuts to specify some common time intervals for the specified script to run. These include the following:
@yearly | @annually: job will run at 00:00 Jan 01 each year.
@monthly: job will run at 00:00 on the first day of each month.
@weekly: job will run at 00:00 Sunday of each week.
@daily | @midnight: job will run at 00:00 each day.
@hourly: job will run at the first minute of each hour.
|Slurm cannot guarantee that the jobs will run at the requested times, but tries to schedule it as close as possible. Internally, jobs are submitted to Slurm and set with a specific BeginTime. Once a scron job ran, it will be requeued with a new BeginTime. These jobs will also show up in squeue.|
scrontab is used to set, edit, and remove a user’s Slurm-managed
crontab file. This file can define several recurring jobs to run jobs at a specific interval.
scrontab [-u user] [ -e | -l | -r ]
-uuser to edit crontab for.
-eedits user’s crontab. If a crontab does not exist already, a default example (without any defined entries) will be provided in the editor. The currently running reccuring jobs continue, but no more reccuring jobs later.
-llists user’s crontab.
-rdeletes user’s crontab.
To edit your scrontab file run:
If a scrontab does not exist already, a default example (without any defined entries) will be provided in the editor.
To list all the current scrontabs, run:
At anytime you can delete your scrontabs by running:
To print the date every day at 8 am, you must edit the
scrontab using the command
scrontab -e and add the following to it:
#SCRON -p normal #SCRON --chdir /path/to_output #SCRON -o %j-out.txt 0 8 * * * echo $(date +%F)
-p defines the partition to run the job.
--chdir to define the output path, because the output is placed in the home directory by default.
-o names the output file.
Suppose you have a job script
example_job.sh with the following content:
#!/bin/bash #SBATCH --job-name=TestJob #SBATCH --ntasks=3 #SBATCH --time=00:05:00 #SBATCH --cpus-per-task=2 #SBATCH --mem-per-cpu=1G # memory per CPU core #SBATCH --partition=normal ## the partitions to run in (comma seperated) srun --ntasks=1 --nodes=1 --cpus-per-task=$SLURM_CPUS_PER_TASK bash -c "sleep 10; echo 'hello 1'" & srun --ntasks=1 --nodes=1 --cpus-per-task=$SLURM_CPUS_PER_TASK bash -c "sleep 20; echo 'hello 2'" & srun --ntasks=1 --nodes=1 --cpus-per-task=$SLURM_CPUS_PER_TASK bash -c "sleep 30; echo 'hello 3'" &
And you need to run this job monthly, edit the
scrontab and add the following:
INPUTDIR=/path/to_the_job #SCRON --chdir /path/to_output @monthly $INPUTDIR/example_job.sh