Tuesday, 24 April 2012

cron/crontab Task Scheduler - HOW TO

cron is a time-based job scheduler in Unix-like computer operating systems. cron enables users to schedule jobs (commands or shell scripts) to run periodically at certain times or dates. It is commonly used to automate system maintenance or administration, though its general-purpose nature means that it can be used for other purposes, such as connecting to the Internet and downloading email.

To view the cron list on your current OS, execute the following command...
Code Snippet
  1. crontab -l
End of Code Snippet

The cron list above shows you which jobs are currently runing on your system. It may be totally empty, or it may have some jobs in there. Lets take a look at adding jobs to the cron list.

Adding jobs to the cron list
The cron list is like a plain text file... the location of this depends of what OS you are running. However, we can simply edit the cron list by executing the following command...
Code Snippet
  1. crontab -e
End of Code Snippet

If you cannot view the cron list, then you may need to set the EDITOR environment variable to your default editor (nano, vi etc...)

Now we have the cron list in view, lets look at adding a job...

All jobs in the cron list take the following format (We can also forward the output to another process, we'll look at this later).

 *   *    *   *   *    Command to be executed
┬   ┬  ┬  ┬  ┬
│ │ │ │ │
│ │ │ │ │
│ │ │ │ └───── day of week (0 - 6) (0 is Sunday, or use names)
│ │ │ └────────── month (1 - 12)
│ │ └─────────────── day of month (1 - 31)
│ └──────────────────── hour (0 - 23)
└───────────────────────── min (0 - 59)

Lets take a look at this example...
30 22 * * * /usr/local/bin/TenThirtyScript.sh >>/usr/local/CronLog.log 2>&1

This cron entry will execute the "TenThirtyScript.sh" script every day at 22:30... It will also store all of the scripts output in the "CronLog.log" file (useful for debugging cron entries!)

Extra Info (What does 2>&1 mean?)
2 is the default file descriptor for stderr.
1 is the default file descriptor for stdout.
>& is shell syntax for "fold a file descriptor into another"

Special Characters
We can also schedule more complex cron jobs using some special characters.

Asterisk ( * )
The asterisk indicates that the cron expression will match for all values of the field; e.g., using an asterisk in the 4th field (month) would indicate every month.

Slash ( / )
Slashes are used to describe increments of ranges. For example 3-59/15 in the 1st field (minutes) would indicate the 3rd minute of the hour and every 15 minutes thereafter. The form "*/..." is equivalent to the form "first-last/...", that is, an increment over the largest possible range of the field.

Percent ( % )
Percent-signs (%) in the command, unless escaped with backslash (\), will be changed into newline characters, and all data after the first % will be sent to the command as standard input.

Comma ( , )
Commas are used to separate items of a list. For example, using "MON,WED,FRI" in the 5th field (day of week) would mean Mondays, Wednesdays and Fridays.

Hyphen ( - )
Hyphens are used to define ranges. For example, 2000-2010 would indicate every year between 2000 and 2010 CE inclusive.

'L' stands for "last". When used in the day-of-week field, it allows you to specify constructs such as "the last Friday" ("5L") of a given month. In the day-of-month field, it specifies the last day of the month.

The 'W' character is allowed for the day-of-month field. This character is used to specify the weekday (Monday-Friday) nearest the given day. As an example, if you were to specify "15W" as the value for the day-of-month field, the meaning is: "the nearest weekday to the 15th of the month". So if the 15th is a Saturday, the trigger will fire on Friday the 14th. If the 15th is a Sunday, the trigger will fire on Monday the 16th. If the 15th is a Tuesday, then it will fire on Tuesday the 15th. However if you specify "1W" as the value for day-of-month, and the 1st is a Saturday, the trigger will fire on Monday the 3rd, as it will not 'jump' over the boundary of a month's days. The 'W' character can be specified only when the day-of-month is a single day, not a range or list of days.

Hash ( # )
'#' is allowed for the day-of-week field, and must be followed by a number between one and five. It allows you to specify constructs such as "the second Friday" of a given month.[citation needed]

Question mark ( ? )
Note: Question mark is a non-standard character and exists only in some cron implementations. It is used instead of '*' for leaving either day-of-month or day-of-week blank.

Here are some more examples...

23:00:00 every weekday night
0 23 * * MON-FRI /usr/local/bin/TestScript.sh >/dev/null 2>&1

In 2003 on the 11th to 26th of each month from January to June every third minute starting from 2 past 1am, 9am and 10pm
2-59/3 1,9,22 11-26 1-6 * 2003 /usr/local/bin/TestScript.sh >/dev/null 2>&1

Note: ">/dev/null" forwards the output to a bottomless pit! Useful if you want to remove trace of the output completely.

cron Permissions
The following two files play an important role:

/etc/cron.allow - If this file exists, then you must be listed therein (your username must be listed) in order to be allowed to use cron jobs.

/etc/cron.deny - If the cron.allow file does not exist but the /etc/cron.deny file does exist, then you must not be listed in the /etc/cron.deny file in order to use cron jobs.

Please note that if neither of these files exists, then depending on site-dependent configuration parameters, only the super user will be allowed to use cron jobs, or all users will be able to use cron jobs.....

Saving Changes
Once you have made all the changes to the cron list file, save the file (I.e. !wq in vi)

You will now need to restart the cron service to pick up your changes.
Code Snippet
  1. /etc/init.d/cron stop
  2. /etc/init.d/cron start
End of Code Snippet

This command depends on which OS you are running.... See this link for restarting services on various distros of Linux: http://theos.in/desktop-linux/tip-that-matters/how-do-i-restart-linux-network-service/

No comments: