Skip to page content or skip to Accesskey List.
Search evolt.org
evolt.org login: or register

Work

Main Page Content

Cron - a regular workhorse

Rated 4.05 (Ratings: 4) (Add your rating)

Log in to add a comment
(4 comments so far)

Want more?

 
Picture of MartinB

Martin Burns

Member info | Full bio

User since: April 26, 1999

Last login: August 02, 2008

Articles written: 126

So, you can write CGI scripts. And they get kicked off when a user goes to your page, and fills in a form.

But what if you want to have things going on even if you don't get any users? What if you want to run a big database job nightly, ready for your first morning's visitor? Or maybe you want to have an autoresponder check a POP box every few minutes, and fire out appropriate response emails?

If you're on a Unix-type server, you're in luck. *nix can kick off your script at any given time interval, without your intervention, and we're going to show you how, using an autoresponder Perl script as an example.

What you'll need:

  1. A Unix (including Linux) web server where your scripts are living;
  2. Telnet access to that server (shouldn't be a problem - try throwing your Telnet application at www.yourdomain.com using the user ID & password you use for FTP);
  3. A text editor and FTP application;
  4. A non-paranoid sysadmin who hasn't disabled cron - if they let you install your own CGIs, you'll probably be OK.
  5. For the demo script we're using, you'll need Perl, with the Mail::POP3 module, a POP box which the module can access and sendmail access (ask your sysadmin about these).
  6. Two beers (80/- from Edinburgh's Caledonian brewery recommended).

So what is Cron?

It's a process that's running all the time on the server. What it does is continuously check through each user's list of scheduled jobs, and if one's due to run, it runs it. The lists are called Crontabs, and can contain any Unix command, including running a script. You can edit your Crontab directly, which can be quick and dirty, or you can take the easier method of submitting a text file instead. As I'm all for an easy life, we'll be using the second method.

The demo script

OK, here's the Perl script we'll be running. It checks the POP box which bots@easyweb.co.uk throws mail into, gets any mail, and emails the sender back an appropriate message, depending on the incoming email's subject. If you want to use this, then you're welcome, but remember to tell people where you got it ;-)

Install this script, as normal, making sure it's executable, and take a note of the full path to it (it might be something like /home/yourlogin/cgi-bin/autoresponder.cgi).

You'll now need to test that the script works. Email the mailbox, then telnet into your server, and (assuming that your script is living in the cgi-bin subdirectory of your space), enter the following commands:

 cd cgi-bin
 autoresponder.cgi

All things being equal, you should get an email back, and you can crack open your first beer.

Setting up the Cron job

Now you have a working script, you'll need to kick it off fairly frequently. We'll be keeping a balance between not overloading the server (keeping your sysadmin and users happy), while still having it run often enough, we'll run the job every 5 minutes.

Crontab format

The general format for Crontabs is:

minute hour day month weekday command

Note that

  • hour in 24 hour format
  • 0 is Sunday, 6 is Saturday for day
  • command can be any system command, or the full path to a user script

So to have my script (which is at /home/web3060/cgi-bin/autoresponder.cgi) running at 9:10pm on 30th September, I'd use

10 21 30 9 * /home/web3060/cgi-bin/autoresponder.cgi

The other 2 things you need to know is that an asterisk in any field means all values, so 0 23 * * * /usr/local/bin/disktidy will run at eleven PM every night,  0 23 1 * * command will run at eleven PM every 1st of the month,  15 5 * * 1 command will run at 5:15 am every Monday etc, and that if you want more than one value in a field, separate them by commas (remember not to put a space within a field, or the system will get confused). This means that to fire our script every 5 minutes every hour, every day, every month, we'll need the following:

0,5,10,15,20,25,30,35,40,45,50,55 * * * * /full/path/to/autoresponder.cgi

Copy the above, crack open that text editor and paste it in - replacing /full/path/to/autoresponder.cgi with the equivalent for your system — save it as autoresp.ctb and FTP the file into your own space (your home directory for preference).

Now telnet into your webspace and enter your Crontab command by entering the following:

crontab autoresp.ctb

You can check that this has worked by entering  crontab -l which should give back a list containing the Crontab entry above (y'know - 0,5,10 etc). One more command which you might like to take a note of now is  crontab -r which removes your Crontab, so you can back out your change if needed.

Now all you have to do is run your test. Email the mailbox, and sit back for 5 minutes or so. Your server might not the job exactly at the time specified (and if you've specified an hour of day, beware of timezones too), as it considers background jobs like this as less important than other stuff it's doing, like delivering web pages to users who think every second counts. But after a few minutes you should get an email back. Congratulations! You can crack open that other beer safe in the knowledge that you can now do stuff that 90% of other web designers can't.

Martin Burns has been doing this stuff since Netscape 1.0 days. Starting with the communication ends that online media support, he moved back through design, HTML and server-side code. Then he got into running the whole show. These days he's working for these people as a Project Manager, and still thinks (nearly 6 years on) it's a hell of a lot better than working for a dot-com. In his Copious Free Time™, he helps out running a Cloth Nappies online store.

Amongst his favourite things is ZopeDrupal, which he uses to run his personal site. He's starting to (re)gain a sneaking regard for ECMAscript since the arrival of unobtrusive scripting.

He's been a member of evolt.org since the very early days, a board member, a president, a writer and even contributed a modest amount of template code for the current site. Above all, he likes evolt.org to do things because it knowingly chooses to do so, rather than randomly stumbling into them. He's also one of the boys and girls who beervolts in the UK, although the arrival of small children in his life have knocked the frequency for 6.

Most likely to ask: Why would a client pay you to do that?

Least likely to ask: Why isn't that navigation frame in Flash?

Quicker 5 Minute Syntax

Submitted by morbus on January 23, 2001 - 19:11.

While the five minute crontab entry above definitely works, you can also cheat and use an expression like the one below: 0-59/5 * * * * /full/path/to/autoresponder.cgi Likewise, to run the script every 10 minutes instead of 5, just change the dividend (or divisor? I always forget which is which): 0-59/10 * * * * /full/path/to/autoresponder.cgi

login or register to post comments

Perl support

Submitted by MartinB on January 27, 2001 - 13:08.

One thing to bear in mind is that some servers will slurp up the Perl shebang line and understand that the script is supposed to be Perl.

Others won't - the crontab will have to be standard shell scripting commands (or a link to a shell script). The way to kick off a Perl script in this environment is to tell the interpreter to run Perl on the script (ie the command is 'run Perl' with an argument of the path to the script it is to run):

10 21 30 9 * perl /home/web3060/cgi-bin/autoresponder.cgi 

Test this first by just entering perl /home/web3060/cgi-bin/autoresponder.cgi at the telnet prompt. If it complains that it can't find Perl then you'll have to tell it explicitly. Enter which perl at the prompt, and it'll give you back the absolute path (probably something like /usr/bin/perl). Put this into the crontab:

10 21 30 9 * /usr/bin/perl /home/web3060/cgi-bin/autoresponder.cgi 

Again, testing first at the prompt

login or register to post comments

Thank you

Submitted by anylaurie on January 23, 2002 - 22:28.

I'm just learning about Unix and the documentation for a CGI script I'm installing said "Add instructions in your crontab." This article answered all my questions, starting with "what is a crontab?"

login or register to post comments

Quicker 5 Minute Syntax

Submitted by abraxas on May 15, 2008 - 05:46.

An even shorter syntax for running a cronjob every 5 minutes:
*/5 * * * * /full/path/to/autoresponder.cgi

http://mkaz.com/ref/unix_cron.html:
"You can use forward slash to specify a repeating range. For example: */5 for every five minutes, hours, days".

You should test the command on linux-based systems before completely relying on it.

login or register to post comments

The access keys for this page are: ALT (Control on a Mac) plus:

evolt.orgEvolt.org is an all-volunteer resource for web developers made up of a discussion list, a browser archive, and member-submitted articles. This article is the property of its author, please do not redistribute or use elsewhere without checking with the author.