Home Wiki > SDB:Cron
Sign up | Login

SDB:Cron

tagline: From openSUSE

With cron tabs user could schedule own time-based jobs.

Where and how to setup cron jobs

Missing upstream of vixie-cron (our historical default cron) caused a lot of confusions so, we are looking for new cron to replace it. Check these pages : why why and how we should switch to cronie.

Version: 11.4+This text cover properties and features of new cronie 1.4.4, which will be available in openSUSE 11.4, so could differ in case of the use of openSUSE 11.3 default cron daemon (vixie-cron 4.1). Check Differences between old cron and cronie for more information.

There are several places and ways how to schedule own cron job, basically there are system crontabs like /etc/crontab and /etc/cron.d/ directory which could use only root (but could define jobs also for users) and users crontab which are available through the command crontab -e also for normal user. With all mentioned cases you have to use crontab definitions see fields. You don't need to use crontab definition if you fit to hourly,minutes,weekly or monthly period.

crontab fields

Meanings of each field in line cover description above ( it could contain also more options and field = read whole article )

minute hour day of month month day of week command to be executed
* * * * * command to be executed

Well the meanings of the simplest cron job definition isn't so simple :) (command will be executed each first minute of every hour 00:01, 01:01, 02:01, 03:01 ... etc)

1 * * * *  /path/to/command

More interesting example used slash '/' character to define steps (execute command every 10 minutes)

*/10 * * * *  /path/to/command

In crontabs you could of course use also ranges using '-' character (execute every weekdays at 7:30)

30 7 * * 1-5 echo "Wake up, it's morning, go to work!" | sendmail username

Also lists with sets of numbers are allowed (execute command on the first and fifteenth)

* * 1,15 * *  /path/to/command

As day of week you could use also short name instead of digit ("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun") similar for month ("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"). (execute every Thursday at 15:00)

0 15 * * * Thu echo "Hey! You have team meeting" | sendmail username

Example bellow will run on the first and fifteenth AND every Sunday

* * 1,15 * Sun /path/to/command

If the uid of the crontab owner is 0 (root), he could also use special option to prevent cron from writing a syslog message about executed command, if you want to use this option use '-' as a first character of crontab entry :

- 1 * * * * username /usr/bin/test

crontab -e command

This is the most common way how to user define his cron job. If you want edit cron job just use crontab -e command. It will open preferred (export EDITOR=vim) editor with already defined cronjobs. Each line is represent one cron job definition. With crontab command you could also list your user cronjobs crontab -l.
Crontab definitions are placed in /var/spool/cron/tabs/
If you check user crontab file by hand you could see that we have still zombies in our user crontabs:

# DO NOT EDIT THIS FILE - edit the master and reinstall.
# (/tmp/crontab.XXXXR637JH installed on Tue Apr  6 17:46:35 2010)
# (Cronie version 1.4.4)

/etc/cron.d

This is the good place when you want to create cron job rule for your package and you want exact date/time of execution. Your crontab rule could be normal file,symlink or hardlink. It have to be owned by root (also write allowed only for root) and not executable.
After default openSUSE installation you could see crontab which are owned by some packages :

ll /etc/cron.d/
total 8
-rw-r--r-- 1 root root  63 2009-10-13 19:44 novell.com-suse_register
-rw-r--r-- 1 root root 268 2009-09-12 00:19 smolt

Cron job rules in syscrondir are not owned by cron package itself, e.g.:

# rpm -qf /etc/cron.d/smolt
smolt-1.4-2.6.1.noarch

As you could see in next listing, files in syscrondir contain standard cronjob rules, whit ine exception we have to specify user (in our case smolt)

# cat /etc/cron.d/smolt
# Runs the smolt checkin client
# Please note that calling with -c will cause smolt to pause a random amount of
# time between 0 and 3 days before actually sending, this is to prevent ddos on
# the server
20 1 1 * * smolt /usr/bin/smoltSendProfile -c > /dev/null 2>&1

/etc/crontab

In most case user doesn't need to change this file. After installation system cron tab contain one important rule which start run-crons script (this script execute all scripts in directories daily,hourly,weekly).

# cat /etc/crontab
SHELL=/bin/sh
PATH=/usr/bin:/usr/sbin:/sbin:/bin:/usr/lib/news/bin
MAILTO=root
#
# check scripts in cron.hourly, cron.daily, cron.weekly, and cron.monthly
#
-*/15 * * * *   root  test -x /usr/lib/cron/run-crons && /usr/lib/cron/run-crons >/dev/null 2>&1

cron.hourly cron.daily cron.weekly cron.monthly

This is the good place when you want create cron job rule for your package and you don't need to use crontab rule for exact time. These directories are simple way, how to schedule script executing in daily, hourly, weekly or monthly period. You have to just push your script (owned by root,with exec permissions) to one of these directories. See listing of daily cronjobs, again all crontab files are not owned by cron package

#> ll /etc/cron.daily/
total 32
-rwxr-xr-x 1 root root  587 2009-10-24 05:20 logrotate
-rwxr--r-- 1 root root  948 2009-10-24 05:50 suse-clean_catman
-rwxr-xr-x 1 root root 1875 2003-09-01 13:10 suse.de-backup-rc.config
-rwxr-xr-x 1 root root 2059 2003-09-08 15:50 suse.de-backup-rpmdb
-rwxr-xr-x 1 root root  566 2004-07-23 12:38 suse.de-check-battery
-rwxr-xr-x 1 root root 1314 2005-07-27 15:28 suse.de-clean-tmp
-rwxr-xr-x 1 root root  371 2003-09-01 13:10 suse.de-cron-local
-rwxr--r-- 1 root root 1693 2009-10-24 05:50 suse-do_mandb

As I mention above, processing of these directories is provided by the shell script /usr/lib/cron/run-crons. This script is triggered by cron job (defined in /etc/crontab) every 15 minutes. If you have build service account you could check run-crons script here. Basically it execute /etc/sysconfig/cron (inside aaa_base package) to get sysconfig settings, evaluate this settings and execute scripts in mentioned directories in appropriate time period.

Parts of cron spread in the file system

/etc/cron.deny Users listed in this file can't use crontab -e command to add cron job rule. but their Cron jobs will be executed (if are already defined)
/etc/cron.allow If this file exist and you want to use crontab -e command, your user have to be added to this file
/etc/crontab main crontab
/etc/init.d/cron cron init script
/etc/sysconfig/cron sysconfig of initscript which is processed by run-crons script. Using this config you could change behavior of processing of scripts which are placed inside /etc/cron.{hourly,daily,weekly,monhtly}
/etc/omc/srvinfo.d/cron.xml see omc umbrella project http://developer.novell.com/wiki/index.php/OMC
/usr/bin/crontab command intended for editing user crontab (setuid bit set)
/usr/lib/cron/run-crons this script is executed every 15 minutes from main crontab and process scripts places in /etc/cron.{hourly,daily,weekly,monhtly}
/usr/sbin/cron cron daemon binary executed from init script
/usr/sbin/rccron just a link to /etc/init.d/cron
/var/spool/cron/lastrun this directory could contain files cron.hourly,cron.daily, cron.weekly, cron.monthly which marks last execution time of scripts from /etc/cron.{hourly,daily,weekly,monthly}
/var/spool/cron/tabs in this directory are placed user crontabs read and write access only for root
/var/run/cron.pid pid of currently runnig cron daemon

Cron daemon options

debug cron

If cron doesn't do what you wish, use debug options : stop the cron daemon and start cron daemon with -x option with appended one or more debug flags. You could also use -n option to run cron daemon in foreground :

# rccron stop
# cron -nx pars,load

Available debug flags : ext,sch,proc,pars,load,misc,test,bit