Top

A Linux User Reference

Search tips
  • search ignores words that are less than 4 characters in length
  • searches are case insensitve
  • if a search does not return anything try it in Boolean mode then Query expansion mode by checking the appropriate radio button e.g. searching for 'cron' in just the Administration category returns nothing - presumably because the 50% threshold is reached. Boolean mode ignores this threshold so a search for 'cron' returns several hits
  • in Boolean mode preceding a word with a '+' means the result must include that word, a '-' means it must not
  • in Boolean mode '+crontab -anacron' means match articles about crontab that DO NOT mention anacron
  • to match a phrase e.g. 'manage system' check the Boolean mode radio button and enclose the phrase in quotes "some phrase ..."
  • in Query expansion mode the search context is expanded beyond the keywords you entered - relevancy of hits may well be degraded

ADMINISTRATION

Automation

  • CRON or ANACRON?

    cron works well for systems that run continuously. anacron (anachronistic cron) works well for systems that are turned off and on frequently

  • CRON files

    Implementation, namely directory structure and use of run-parts, can vary depending on the distribution.

    There are three types of crontab files - user crontabs, system crontabs and the system wide crontab. Usually only the system wide crontab file is named crontab.

    /var/spool/cron/crontabs/<user> - User crontabs
    /etc/cron.d/ - System crontabs
    /etc/crontab - System wide default crontab. 
    

    System crontab files have an extra user field between the day of week and command fields.

    Debian based distributions also contain directories that contain scripts to be run at pre-defined intervals

    /etc/cron.daily
    /etc/cron.hourly
    /etc/cron.weekly
    /etc/cron.monthly
    

    A task file or script needs to be executable, a crontab file (in /etc/cron.d) does not.

  • System wide default file
    /etc/crontab

    Contains system wide defaults. This file along with System crontab files (in /etc/cron.d/) have an extra field between the and fields.

    Part of a Debian default /etc/crontab

    ....
    SHELL=/bin/sh
    PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
    
    # <minute> <hour> <day of month> <month> <day of week> <user> <command>
    17 * * * * root cd / && run-parts --report /etc/cron.hourly
    25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
    47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
    52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly ) 
    
    /* Where:
     * Minute can be    0-59
     * Hour             0-23
     * Day of Month     1-31
     * Month            1-12 (or names, see below)
     * Day of Week      0-7 (0 or 7 is Sun, or use names)
     * User             System crontabs only, user under whom command should be run
     * Command          Command to run
     */
    

    An * in a field always stands for "first-to-last".

    In addition you can use:

    Type Example
    ranges 8-11 in the hour field specifies execution at 8, 9, 10 and 11 o'clock
    lists "1,2,5,9", "0-4,8-12" in the hour field specifies execution at 1, 2, 5, 9 o'clock and on the hour between midnight and 4am and between 8am and midday
    steps "0-23/2" every other hour, "*/2" every 2 hours
    names Used for the "month" and "day of week" fields. First three letters of day or month. Ranges or lists of names are not allowed.
    sixth field Command to be run. The rest of this line, up to a new-line or %, will be executed by the shell specified in the SHELL variable. % in the cmd, unless escaped "\%", will be changed into newline characters and all data after the first % will be sent to the cmd as standard input.
    Day Can be specified by two fields , day of month and day of week. "30 4 1,15 * 5" runs at 4:30 am on the 1st and 15th of each month, plus every Friday.
    @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 * * *"
    @midnight Same as @daily
    @hourly Run once an hour, "0 * * * *"

    The day of a command's execution can be specified by two fields

    • day of month
    • and day of week.

    If either of the fields is * the command will be run every month or every day, e.g.

    30 4 1,15 * 5 
    

    would cause a command to be run at 4:30 am. on the 1st and 15th of each month, plus every Friday.

  • Run scripts or programs using
    /bin/run-parts

    List the names of all matching scripts or programs in a directory - do NOT run them

    $ run-parts --list /etc/cron.d
    /etc/cron.d/anacron
    /etc/cron.d/php5
    

    List files that match the regular expression - do NOT run them

    $ run-parts --list --regex '^p.*5$' /etc/cron.d
    /etc/cron.d/php5
    

    Print (list) what files will be run from a directory - do NOT run them

    $ run-parts --test /etc/cron.daily
    /etc/cron.daily/0anacron
    /etc/cron.daily/apport
    /etc/cron.daily/apt
    .....
    
  • Automating a new task or job

    Depends on your distribution's implementation. The old way -

    Put your (root) tasks into the /etc/crontab file like so

    ....
    @hourly root /usr/local/bin/hourly-task 
    0,29 * * * * root /usr/local/bin/twice-hourly-task
    

    To run the hourly task in Debian

    Place or sym. link the task script file e.g. 'hourly-task' into the /etc/cron.hourly/ directory.

    17 * * * * root    cd / && run-parts --report /etc/cron.hourly
    

    Run the job at 17 minutes past every hour.

    If you wanted this job to run at a different number of minutes past the hour than the default you can set the job up in the same manner as for 'twice-hourly-task'.

    To run the twice hourly task in Debian

    Create a crontab file in /etc/cron.d/ with the following entry

    0,29 * * * * root /usr/local/bin/twice-hourly-task
    33 * * * * root /usr/local/bin/hourly-task          # Run Hourly task at a different time to the default
    

    For further examples you can always look at your systems existing cron jobs.

  • Manage system crontab jobs

    '/usr/sbin/cron' is the daemon that executes scheduled commands. It is started automatically from /etc/init.d on entering multi-user run-levels.

    To manage, edit /etc/crontab or edit and or delete files in the /etc/cron.d directory. Do NOT use the 'crontab' command on files in the /etc/cron.d directory.

  • User crontabs

    Users can have their own personal crontab files. If permitted access to the cron daemon, the tasks within these files will be run under their effective ID.

    The format is the same as for the system crontab files minus the user field.

    Example user crontab file - /var/spool/cron/crontabs/

    # Format:
    # <minute> <hour> <day of month> <month> <day of week> <command>
    
    # use /bin/sh to run commands, no matter what /etc/passwd says
    SHELL=/bin/sh
    
    # mail any output to paul, no matter whose crontab this is
    MAILTO=paul
    
    # run five minutes after midnight, every day
    5 0 * * *       $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
    
    # run at 2:15pm on the first of every month -- output mailed to paul
    15 14 1 * *     $HOME/bin/monthly
    
    # run at 10 pm on weekdays, annoy Joe
    0 22 * * 1-5    mail -s "It's 10pm" joe%Joe,%%Where are your kids?%
    23 0-23/2 * * * echo "run 23 minutes after midn, 2am, 4am ..., everyday"
    5 4 * * sun     echo "run at 5 after 4 every sunday"
    
    
  • Maintain crontab files for individual users
    /usr/bin/crontab
    • Like the 'passwd' command '/usr/bin/crontab' is a suid program that runs with root authority.
    • It maintains crontab files for individual users, its default operation is to replace.

    Edit or create a user crontab

    $ sudo ls -al /var/spool/cron/crontabs
    ....
    drwx-wx--T 2 root crontab 4096 Jun 14  2012 .
    drwxr-xr-x 5 root root    4096 Oct 17  2012 ..
    
    $ crontab -e
    no crontab for mark - using an empty one
    
    Select an editor.  To change later, run 'select-editor'.
      1. /bin/ed
      2. /bin/nano        <---- easiest
      3. /usr/bin/vim.tiny
    
    Choose 1-3 [2]: 
    crontab: installing new crontab
    
    $ sudo ls -al /var/spool/cron/crontabs
    ....
    drwx-wx--T 2 root crontab 4096 Oct 30 21:27 .
    drwxr-xr-x 5 root root    4096 Oct 17  2012 ..
    -rw------- 1 mark crontab 1090 Oct 30 21:27 mark
    

    View, list user crontab

    $ crontab -l
    # Edit this file to introduce tasks to be run by cron.
    ....
    # For more information see the manual pages of crontab(5) and cron(8)
    # 
    # m h  dom mon dow   command
    

    Delete user crontab

    $ crontab -r
    
    $ sudo ls -al /var/spool/cron/crontabs
    ....
    drwx-wx--T 2 root crontab 4096 Oct 30 21:33 .
    drwxr-xr-x 5 root root    4096 Oct 17  2012 ..
    
  • Anachronistic cron
    /usr/sbin/anacron
    • Can handle scheduling of jobs on a daily, weekly or monthly basis.
    • Does NOT handle hourly jobs.
    • It keeps timestamp files in /var/spool/anacron. These record when jobs were last run.
    • Each time 'anacron' runs, it checks to see if the required number of days has passed since a job was last run and runs it if necessary.

    Anacron timestamp files

    $ sudo more /var/spool/anacron/*
    ::::::::::::::
    /var/spool/anacron/cron.daily
    ::::::::::::::
    20131030
    ::::::::::::::
    /var/spool/anacron/cron.monthly
    ::::::::::::::
    20131028
    ::::::::::::::
    /var/spool/anacron/cron.weekly
    ::::::::::::::
    20131029
    
  • Anacron's crontab file
    /etc/anacrontab

    Do NOT use the crontab command on anacron files.

    Example configuration file with added comments

    # /etc/anacrontab - table of jobs for anacron.
    # Format: <period> <delay> <job-identifier> <command>
    #
    # period           Number of days, can be specified as '@monthly' (runs only once per month)
    # delay            Number of minutes to wait before starting job,  prevents a flood of jobs 
    #                  on system start
    # Job identifier   Can contain any non-blank character except slashes (/)
    
    SHELL=/bin/sh
    PATH=/sbin:/bin:/usr/sbin:/usr/bin
    MAILTO=root
    1       65      cron.daily        run-parts /etc/cron.daily
    7       70      cron.weekly       run-parts /etc/cron.weekly
    30      75      cron.monthly      run-parts /etc/cron.monthly
    

    To delete anacron jobs edit /etc/anacrontab

  • Execute a command at a specific time
    /usr/bin/at

    Executes commands at a specified time.

    There are several recognised keywords that can be use to specify the time

    hh:mm[am | pm | today | tomorrow], midnight | noon | teatime(4pm)
    : Run a job at a specific time of day (If that time is already past, next day is assumed).
    
    mmddyy | mm/dd/yy | mm.dd.yy
    : Date must follow time of day.
    
    \+ count time-units 
    : Where the time-units can be minutes, hours, days or weeks.
    

    Run a command in 5 minutes time

    $ cat joblog.txt
    $ date
    Wed Oct 30 22:02:43 GMT 2013
    
    $ at now + 5 minutes
    warning: commands will be executed using /bin/sh
    at> echo "running job" > /home/mark/joblog.txt
    at> date >> /home/mark/joblog.txt
    at> <EOT>                                           (<EOT> == 'Ctrl + d')
    job 2 at Wed Oct 30 22:07:00 2013
    
    $ at -l
    2  Wed Oct 30 22:07:00 2013 a mark
    
    $ at -l
    $ cat joblog.txt
    running job
    Wed Oct 30 22:07:00 GMT 2013
    

    Delete a scheduled job

    $ at 4pm + 3 days 
    warning: commands will be executed using /bin/sh
    at> echo "delete me" 2>&1 > /dev/null
    at> <EOT>
    job 3 at Sat Nov  2 16:00:00 2013
    
    $ at -l                                     (same as "atq")
    3   Sat Nov  2 16:00:00 2013 a mark
    
    $ atrm 3                                    (same as "at -r" and "at -d")                  
    $ at -l
    $
    
  • Run jobs queued by 'at'
    /usr/sbin/atd

    Run jobs queued by at for later execution. atd won't work if its spool directory is mounted via NFS even if no_root_squash is set.

    /var/spool/cron 'atd' files

    atjobs           - jobs directory, should be mode 700, owner daemon.
    atspool          - output directory, should be mode 700, owner daemon.
    
    
  • Execute a command at a specific time
    /usr/bin/batch
    • As with 'at', 'batch' reads commands which are to be executed at a later time from standard input or a specified file.
    • Unlike 'at', 'batch' executes these commands when system load levels permit - when the load average drops below 1.5 (default) or the value specified in the invocation of 'atd'.
  • Controlling user access

    User access to 'at' or 'cron' services is controlled by white and black lists.

    Access control files

    /etc/cron.allow     - if it exists only those users listed can use cron
    /etc/cron.deny      - if it exists users listed cannot use cron
                        - if it exists and 'cron.allow' does not exist all users 
                          apart from those listed in 'deny.allow' can use cron
    
    
    /etc/at.allow       - same as for cron
    /etc/at.deny        - same as for cron. If exists and is empty (default) all users have access to at
    
    

    If neither file exists

    cron                - all users have access
    at                  - only root has access