Anda di halaman 1dari 12

What is Cron?

Cron is a daemon used for scheduling tasks to be executed at a certain time. Each user has a
crontab file, allowing them to specify actions and times that they should be executed. There is
also a system crontab, allowing tasks such as log rotation and locate database updating to be
done regularly.

The following directions tell you how to set up scheduled tasks the traditional way using the
command line, but it is much easier to use the Gnome Scheduled tasks tool (from the gnome-
schedule package) inApplications --> System Tools.

What is Crontab?
A crontab is a simple text file that holds a list of commands that are to be run at specified times.
These commands, and their related run times, are controlled by the cron daemon and are
executed in the system's background. More information can be found by viewing the crontab's
man page.

Using Cron
To use cron, simply add entries to your crontab file. To do this, open a terminal window and
enter crontab -e. An editor will open displaying your current crontab file. Edit the crontab using
the format described below. Then save your changes and your new crontab will be installed.
Exiting without saving will leave your crontab untouched.

Crontab Sections
Each of the sections is separated by a space, with the final section having one or more spaces in
it. No spaces are allowed within Sections 1-5, only between them. Sections 1-5 are used to
indicate when and how often you want the task to be executed. This is how a cron job is laid out:

minute (0-59), hour (0-23, 0 = midnight), day (1-31), month (1-12), weekday (0-6, 0 = Sunday),
command

01 04 1 1 1 /usr/bin/somedirectory/somecommand

The above example will run /usr/bin/somedirectory/somecommand at 4:01am on January 1st plus
every Monday in January. An asterisk (*) can be used so that every instance (every hour, every
weekday, every month, etc.) of a time period is used. Code:

01 04 * * * /usr/bin/somedirectory/somecommand

The above example will run /usr/bin/somedirectory/somecommand at 4:01am on every day of


every month.

Comma-separated values can be used to run more than one instance of a particular command
within a time period. Dash-separated values can be used to run a command continuously. Code:

01,31 04,05 1-15 1,6 * /usr/bin/somedirectory/somecommand


The above example will run /usr/bin/somedirectory/somecommand at 01 and 31 past the hours of
4:00am and 5:00am on the 1st through the 15th of every January and June.

The "/usr/bin/somedirectory/somecommand" text in the above examples indicates the task which
will be run at the specified times. It is recommended that you use the full path to the desired
commands as shown in the above examples. Enter which somecommand in the terminal to find
the full path to somecommand. The crontab will begin running as soon as it is properly edited and
saved.

You may want to run a script some number of times per time unit. For example if you want to run
it every 10 minutes use the following crontab entry (runs on minutes divisible by 10: 0, 10, 20, 30,
etc.)

*/10 * * * * /usr/bin/somedirectory/somecommand

which is also equivalent to the more cumbersome

0,10,20,30,40,50 * * * * /usr/bin/somedirectory/somecommand
Crontab Options

 The -l option causes the current crontab to be displayed on standard output.


 The -r option causes the current crontab to be removed.
 The -e option is used to edit the current crontab using the editor specified by the EDITOR
environment variable.

After you exit from the editor, the modified crontab will be checked for accuracy and, if there are
no errors, installed automatically.The file is stored in /var/spool/cron/crontabs but should only be
edited via the crontab command.

Enable User Level Cron


If the /etc/cron.allow file exists, then users must be listed in it in order to be allowed to run
the crontab command. If the/etc/cron.allow file does not exist but the /etc/cron.deny file does,
then users must not be listed in the /etc/cron.deny file in order to run crontab.

In the case where neither file exists, the default on current Ubuntu (and Debian, but not some
other Linux and UNIX systems) is to allow all users to run jobs with crontab.

No cron.allow or cron.deny files exist in a standard Ubuntu install, so all users should have cron
available by default, until one of those files is created. If a blank cron.deny file has been created,
that will change to the standard behavior users of other operating systems might expect: cron
only available to root or users in cron.allow.

Further Considerations
The above commands are stored in a crontab file belonging to your user account and executed
with your level of permissions. If you want to regularly run a command requiring a greater level of
permissions, set up a root crontab file using:

sudo crontab -e
Depending on the commands being run, you may need to expand the root users PATH variable
by putting the following line at the top of their crontab file:

PATH=/usr/sbin:/usr/bin:/sbin:/bin

It is sensible to test that your cron jobs work as intended. One method for doing this is to set up
the job to run a couple of minutes in the future and then check the results before finalising the
timing. You may also find it useful to put the commands into script files that log their success or
failure, eg:

echo "Nightly Backup Successful: $(date)" >> /tmp/mybackup.log

For more information, see the man pages for cron and crontab (man is detailed on


the BasicCommands page). If your machine is regularly switched off, you may also be interested
in at and anacron, which provide other approaches to scheduled tasks. For
example, anacron offers simple system-wide directories for running commands hourly, daily,
weekly, and monthly. Scripts to be executed in said times can be placed
in /etc/cron.hourly/, /etc/cron.daily/, /etc/cron.weekly/, and /etc/cron.monthly/. All scripts in
each directory are run as root, and a specific order to running the scripts can be specified by
prefixing the scripts' filenames with numbers (see the man page for run-parts for more details).
Although the directories contain periods in their names, run-parts will not accept a file name
containing one and will fail silently when encountering them (bug #38022). Either rename the file
or use a symlink (without a period) to it instead.

Troubleshooting and Common Problems


Edits to a user's crontab and jobs that are run on their behalf are all logged by default
to /var/log/syslog and that's the first place to check if things are not running as you expect.

When adding a new entry to a blank crontab, forgetting to add a newline at the end is a common
source for the job not running. If the last line in the crontab does not end with a newline, no errors
will be reported at edit or runtime, but that line will never run. See man crontab for more
information. This has already been suggested as a bug.

If a user was not allowed to execute jobs when their crontab was last edited, just adding them to
the allow list won't do anything. The user needs to re-edit their crontab after being added to
cron.allow before their jobs will run.

When creating a crontab for the root user, the user name must be specified as a parameter after
the date/time parameters. Accidentally including the user name that way in a user-specific
crontab will result in trying to run the user's name as a command, rather than what was expected.

Entries in cron may not run with the same environment, in particular the PATH, as you expect
them to. Try using full paths to files and programs if they're not being located as you expect.

The "%" character is used as newline delimiter in cron commands. If you need to pass that
character into a script, you need to escape it as "\%".

If you're having trouble running a GUI application using cron, see the GUI Applications section
below.

Advanced Crontab
The Crontabs discussed above are user crontabs. Each of the above crontabs is associated with
a user, even the systemcrontab which is associated with the root user. There are two other
types of crontab.

Firstly, as mentioned above anacron uses the run-parts command


and /etc/cron.hourly, /etc/cron.weekly, and/etc/cron.monthly directories.
However anacron itself is invoked from the /etc/crontab file. This file could be used for other
cron commands, but probably shouldn't be. Here's an example line from a ficticious /etc/crontab:

00 01 * * * rusty /home/rusty/rusty-list-files.sh

This would run Rusty's command script as user rusty from his home directory. However, it is not
usual to add commands to this file. While an experienced user should know about it, it is not
recommended that you add anything to /etc/crontab. Apart from anything else, this could cause
problem if the /etc/crontab file is affected by updates! Rusty could lose his command.

The second type of crontab is to be found in /etc/cron.d. Within the directory are small named
crontabs. The directory is often used by packages, and the small crontabs allows a user to be
associated with the commands in them.

Instead of adding a line to /etc/crontab which Rusty knows is not a good idea, Rusty might well
add a file to /etc/cron.d with the name rusty, containing his cron line above. This would not be
affected by updates but is a well known location.

When would you use these alternate crontab locations? Well, on a single user machine or a
shared machine such as a school or college server, a user crontab would be the way to go. But
in a large IT department, where several people might look after a server, then /etc/cron.d is
probably the best place to install crontabs - it's a central point and saves searching for them!

You may not need to look at /etc/crontab or /etc/cron.d, let alone edit them by hand. But an
experienced user should perhaps know about them and that the packages that he/she installs
may use these locations for their crontabs.

Special strings

Cron also offers some special strings:

string meaning
@reboot Run once, at startup.
@yearly Run once a year, "0 0 1 1 *".
@annually (same as @yearly)
@monthly Run once a month, "0 0 1 * *".
@weekly Run once a week, "0 0 * * 0".
@daily Run once a day, "0 0 * * *".
@midnigh
(same as @daily)
t
@hourly Run once an hour, "0 * * * *".

Usage: "@reboot /path/to/execuable1" will execute /path/to/executable1 when the system


starts. See "man 5 crontab" for more info.

GUI Applications
It is possible to run gui applications via cronjobs. This can be done by telling cron which display to
use.

00 06 * * * env DISPLAY=:0 gui_appname

The env DISPLAY=:0 portion will tell cron to use the current display (desktop) for the program
"gui_appname".

And if you have multiple monitors, don't forget to specify on which one the program is to be run.
For example, to run it on the first screen (default screen) use :

00 06 * * * env DISPLAY=:0.0 gui_appname

The env DISPLAY=:0.0 portion will tell cron to use the first screen of the current display for the
program "gui_appname".

Note: GUI users may prefer to use gnome-schedule (aka "Scheduled tasks") to configure GUI
cron jobs. In gnome-schedule, when editing a GUI task, you have to select "X application" in a
dropdown next to the command field.

Note: In Karmic(9.10), you have to enable X ACL for localhost to connect to for GUI applications
to work.

~$ xhost +local:
non-network local connections being added to access control list
~$ xhost
access control enabled, only authorized clients can connect
LOCAL:
...

Tips
crontab -e uses the EDITOR environment variable. to change the editor to your own choice just
set that. You may want to set EDITOR in you .bashrc because many commands use this variable.
Let's set the EDITOR to nano a very easy editor to use:

export EDITOR=nano

There are also files you can edit for system-wide cron jobs. The most common file is located
at /etc/crontab, and this file follows a slightly different syntax than a normal crontab file. Since it
is the base crontab that applies system-wide, you need to specify what user to run the job as;
thus, the syntax is now:

minute(s) hour(s) day(s)_of_month month(s) day(s)_of_week user command


It is recommended, however, that you try to avoid using /etc/crontab unless you need the
flexibility offered by it, or if you'd like to create your own simplified anacron-like system
using run-parts for example. For all cron jobs that you want to have run under your own user
account, you should stick with using crontab -e to edit your local cron jobs rather than editting the
system-wide/etc/crontab.

Crontab Example
Below is an example of how to setup a crontab to run updatedb, which updates the slocate
database: Open a term, type "crontab -e" (without the double quotes) and press enter. Type the
following line, substituting the full path of the application you wish to run for the one shown below,
into the editor:

45 04 * * * /usr/bin/updatedb

Save your changes and exit the editor.

Crontab will let you know if you made any mistakes. The crontab will be installed and begin
running if there are no errors. That's it. You now have a cronjob setup to run updatedb, which
updates the slocate database, every morning at 4:45.

Note: The double-ampersand (&&) can also be used in the "command" section to run multiple
commands consecutively.

45 04 * * * /usr/sbin/chkrootkit && /usr/bin/updatedb

The above example will run chkrootkit followed by updatedb at 4:45am daily - providing you have
all listed apps installed.

How Anacron is Arranged


On Ubuntu 9.10 (and, I presume, on later versions), anacron seems to be set up as follows:

There is a Upstart task, located in /etc/init/anacron.conf, which runs all the jobs
in /etc/anacrontab. It is set to run on startup.

There is a cron.d file (/etc/cron.d/anacron) which causes the Upstart task to be started every
day at 7:30 AM.

There is a file /etc/apm/event.d/anacron, which causes the Upstart task to be started when a


laptop is plugged in to A/C power, or woken up.

In the system crontab (/etc/crontab), if anacron is not execuatable, run-parts is used to run the
files in cron.daily, cron.weekly, and cron.monthly at 6:25 AM, 6:47 AM and 6:52 AM, respectively.

In /etc/anacrontab, run-parts is used to run cron.daily 5 minutes after anacron is started, and
cron.weekly after 10 minutes (once a week), and cron.monthly after 15 (once a month).

Within the cron.daily, weekly, and monthly directories ( /etc/cron.daily, etc.) there is
a 0anacron file that sets the timestamps for anacron, so it will know they have been run, even if it
didn't run them.
So it appears anacron is run on every startup, wake up, plug-in, and at 7:30 AM every day.
Looking at the respective Changelogs and package databases, it looks like this setup is directly
from Debian, and hasn't been changed since at least 2009.

To execute a script at startup of Ubuntu 

Edit /etc/rc.local and add your commands. 


The script must always end with an un exit 0 

To execute a script at startup


Put your script in /etc/rc0.d 
and make it executable (sudo chmod +x myscript) 

Note that : The scripts in this directory are executed in alphabetical order. 
The name of your script must begin with K99 to run at the right time. 

To execute a script at shutdown


Put your script in /etc/rc6.d 
and make it executable (sudo chmod +x myscript) 

Note that: The scripts in this directory are executed in alphabetical order. 


The name of your script must begin with K99 to run at the right time.

How to format date for display or to use in a shell


script

Q. How do I format date to display on screen on for my scripts as per my requirements?

A. You need to use standard date command to format date or time for output or to use in a shell
script.

Syntax to specify format


date +FORMAT

Task: Display date in mm-dd-yy format


Type the command as follows:
$ date +"%m-%d-%y"

Output:
02-27-07

Turn on 4 digit year display:


$ date +"%m-%d-%Y"

Just display date as mm/dd/yy format:


$ date +"%D"

Task: Display time only


Type the command as follows:
$ date +"%T"

Output:

19:55:04

Display locale’s 12-hour clock time


$ date +"%r"

Output:

07:56:05 PM

Display time in HH:MM format:


$ date +"%H-%M"

How do I save time/date format to a variable?


Simply type command as follows at a shell prompt:
$ NOW=$(date +"%m-%d-%Y")

To display a variable use echo / printf command:


$ echo $NOW

Sample shell script:

#!/bin/bash

NOW=$(date +"%m-%d-%Y")
FILE="backup.$NOW.tar.gz"

# rest of script

Complete list of FORMAT control characters supported by date command


FORMAT controls the output.It can be the combination of any one of the following:

date is a basic Unix command for getting or setting the current time and date on your system.
Because it's the easiest way to get current time, this command is extensively used in Unix
scripting.

Getting current time and date in your Unix system


The default usage of this command is simple and requires no additional command line parameters:

ubuntu$ date
Wed Jun 11 11:43:52 IST 2008

Using templates to specify the desired date/time format


date command supports template system for printing the current time and date – so you can use
it to specify the exact format for representing the time and date information – for example, only
print out the day of a month or a current year instead of the whole default timestamp shown
above.
Format is text string which begins with the + character, which consists of a number of special
parameters starting with the % sign: %B, %d, etc.  If you're using spaces or any other elements in
your format string, you need to use double quotes as well.

Here's an example of specifying a format for the date command:


ubuntu$ date "+%B %d, %Y"
June 11, 2008
In this example, the %B represents the full name of the current month, %d is the day of the
month, and %Y is the four-digit representation of the current year.

Here are some of the most useful parameters used for date format specification:

%a locale’s abbreviated weekday name (e.g., Sun)

%A locale’s full weekday name (e.g., Sunday)

%b locale’s abbreviated month name (e.g., Jan)

%B locale’s full month name (e.g., January)


%c locale’s date and time (e.g., Thu Mar 3 23:05:25 2005)

%C century; like %Y, except omit last two digits (e.g., 21)

%d day of month (e.g, 01)

%D date; same as %m/%d/%y

%e day of month, space padded; same as %_d

%F full date; same as %Y-%m-%d

%g last two digits of year of ISO week number (see %G)

%G year of ISO week number (see %V); normally useful only with %V

%h same as %b

%H hour (00..23)

%I hour (01..12)

%j day of year (001..366)

%k hour ( 0..23)

%l hour ( 1..12)

%m month (01..12)

%M minute (00..59)

%R 24-hour hour and minute; same as %H:%M

%s seconds since 1970-01-01 00:00:00 UTC

%S second (00..60)

%T time; same as %H:%M:%S

%u day of week (1..7); 1 is Monday

%w day of week (0..6); 0 is Sunday


%x locale’s date representation (e.g., 12/31/99)

%X locale’s time representation (e.g., 23:13:48)

%y last two digits of year (00..99)

%Y year

Shell Scripting: Creating report/log file names with


date in filename
by N IX CR AF T  on FEBRUARY 5, 2006 · 8 CO MME NT S

When you write a shell scripts you need to create filename with date in it. For example instead of
log file name "secure.log", you can create a filename called "secure-jan-02-06.log".

The date in file will make it easy to find out all logs or reports. You can display the current date
and time in the given FORMAT using date command. If you just type date command it will display
in standard FORMAT:

$ date
Output:
Sun Feb 5 18:23:44 IST 2006
To display date in MONTH-DAY-YEAR format you need to use date command as follows:
$ date +"%b-%d-%y"

Feb-05-06

As you can see I have used FORMAT as follows


date +"FORMAT"
Where, FORMAT can be any one of the following:
 %a : Abbreviated weekday name (Sun..Sat)
 %b : Abbreviated month name (Jan..Dec)
 %B : Full month name, variable length (January..December)
 %d : day of month (01..31)
 %e : day of month, blank padded ( 1..31)
 %H : 24 hour format (00..23)
 %I : 12 hour format (01..12)
 %j : day of year (001..366)
First obtained date:
$ NOW=$(date +"%b-%d-%y")

Create a file with date in filename


$ LOGFILE="log-$NOW.log"

Display filename:
$ echo $LOGFILE

Getting Unix time and date


In Unix shells, the easiest way to get a current time and date is to use the date command:
ubuntu$ date
Tue Jun 10 10:46:07 IST 2008
date is a very smart command, and apart from this default behavior it supports template system
for printing the current time and date – so you can use it to report only specific part of the time
and date like the current hour or the day of a week or the year.
Read the man page for date (type man date in your shell prompt) to learn all the details, but this
is how you use date output templates:
ubuntu$ date "+%b %d, %Y"
Jun 10, 2008
In this example, the %b parameter in this template represents the short name of the current
month, %d is the day of the month, and %Y is the four-digit representation of the current year.

Timing parts of your Unix script


If you're after timing some parts of your script, you'll need to use two variables: one for saving the
time before the start of an observed part of the script, and another one for saving the time after
the same piece of code.

These two variables will be used to subtract the time and report the elapsed time in seconds, so in
order to do this we'll need the date command to report time in seconds. That's why I've given you
an introduction to Unix time earlier: date reports the number of seconds since the Unix epoch:

ubuntu$ date +%s


1213091896

Anda mungkin juga menyukai