Creating a New Cron Job on AWS Linux AMI

Cron is a time-based program used explicitly to initiated other programs at particular times on a Linux system. AWS Linux AMI comes with cron pre-installed and configured, like every other modern Linux installation. The base configuration allows for set up of a task that should be run hourly, daily, weekly or monthly as well as any other time period.

Quick Job Setup

Setting up a job to run hourly, daily, weekly or monthly is very quick. These instructions assume you have already setup an AWS instance and have an SSH client (like PuTTY) available.

  1. Log in to your instance via the SSH client. Transfer to the root user.
  2. Go to the ‘/etc’ directory
  3. Open the appropraite ‘cron.XXXXX’ directory. For example, if you want to add an hourly task, open the ‘cron.hourly’ directory.
  4. Create a new file (shift+F4)
  5. Add a single line for each job you want run. For example if you want to run a PHP script, type “/usr/bin/php -q /path/to/script/script.php”, substituting for the correct path to PHP and the script file.
  6. Save the file. The name doesn’t really matter so long as it is unique. Cron will call every file in the directory at the appropriate time and run the commands in each file.

Custom Job Setup

Setting up a job to run at custom time requires you to understand the crontab syntax. The syntax is not terribly complex (it is similar than Regular Expressions) but is complex enough that you don’t want to deal with it if you do not need to.

Crontab Syntax

Crontab is the configuration structure for cron jobs. Simply, the files are composed of two parts: the settings followed by the jobs.

Crontab settings

The settings section states what should be run, where it is located, who should run it (as in Linux User) and a few other special commands. In the below example, the first 4 lines are settings and the last line is a job.

Example crontab file

SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
01 * * * * root run-parts /etc/cron.hourly

  • “SHELL” identifies which shell state you want to run the scripts under. If it is not included, most systems will default the shell indicated in ‘/etc/passwd’ or just fail to run.
  • “PATH” is location of the cron initiated scripts. If you are regularly running scripts in ‘/usr/bob/scripts’ you could add the path here to avoid having to type ‘/usr/bob/scripts’ for every script. In the above example, the PATH line would become “PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/bob/scripts”
  • “MAILTO” is the address of the webmaster who will receive an email every time these scripts are run.
  • “HOME” is the home directory for cron. It is basically prefixed to any relative path name you use in any script. It is only actually useful if you are going to be running many scripts from the same crontab file.

Crontab jobs

The settings section is the easy part of crontab files. Each job is composed of seven fields each separated by a space. Any field that is not set identified with an asterisk (*).

minute hour day month weekday user cmd

  • minute is the minute the job is to be run.
  • hour is the hour (on a 24 hour clock) when the job is to be run.
  • day is the numerical representation of the day of the month. The values range from 1-31.
  • month is the month’s numerical representation. The values range from 1-12.
  • weekday is the day of the week you want the job to be run on. The values range from 0-7, with Sunday being 0 & 7. If the day and weekday are both specified, the command runs when EITHER is true.
  • user is the Linux user you want to run the command.
  • cmd is the command to be run. This is no different than the commands in the quick job setup section above.

With the exception of day and weekday, all of the other time commands must be true in order for the script to run.

Crontab also supports step function (non-whole number inputs) and ranges. Ranges work just like page ranges do in most word processors with comma (,) separating individual values and dashes (-) representing all values from the first number to the second number. For example, “3-5,7” would fire on 3, 4, 5, and 7. Step functions use a forward slash to fire when the value becomes a whole number. For example a minute value of “*/15” would fire every 15 minutes, when the current minute divided by 15 is a whole number.

Creating a new Crontab File

These instructions assume you have already setup an AWS instance and have an SSH client (like PuTTY) available.

  1. Log in to your instance via the SSH client. Transfer to the root user.
  2. Go to the ‘/etc/cron.d’ directory
  3. Create a new file (shift+F4)
  4. Add each setting value as its own line at the beginning of the file. The above example file’s values should work on the AWS Linux AMI installation.
  5. Add crontab job lines for each job you want to run.
  6. Save the file. The name doesn’t really matter so long as it is unique. Cron will call every file in the directory at the appropriate time and run the commands in each file.

3 thoughts on “Creating a New Cron Job on AWS Linux AMI

  1. Thanks for the great about scheduling Cron Jobs on AWS! I have been looking for this for a while, and I couldn’t find a quick way to run a PHP script programmatically and without needing to SSH into my server!

  2. I’ve created a file under /etc/cron.d to run a php command of my framework every 5 minute, it is a command to empty the spool of e-mails. I was looking for command to check which cron jobs are setted and find “crontab -u ec2-user -l” but it returns nothing. Any advice?

    • Sorry for the delay responding.

      There could be a lot of reasons. The most likely is that you are running crontab with the default setting which means it is displaying the crontab SPOOL RATHER THAN THE FILES. I wouldn’t worry about checking the job using crontab, rather just look in the log file (probably /var/log/cron) and check for the file you want to run. Since it should be run every five minutes, it is easier to just recheck the log file than trying to reconfigure crontab to display everything.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s