分类: LINUX
2010-01-04 13:13:23
cron - 定期执行指定命令的守护程序 (Vixie Cron) 总览 cron 描述 Cron 应 该 由 /etc/rc 或 者 /etc/rc.local 启 动 ( 译 注:有很多发行版与此不同的,如 RedHat6.x 使用 /etc/rc.d/init.d/crond )。系统会立即返回提示符状态,因此没有必要 后 缀 ’&’ 来 启 动 。 Cron 在 目 录 /var/spool/cron 下搜索以 /etc/passwd 中账户名命名的 crontab 文件,将找到的文件内容加载到内存中。 Cron 还搜 索 /etc/crontab 和目录 /etc/cron.d/ 下的文件,但这些文件使用另外的格式。(见 crontab(5) )。 Cron 平时出 于 休眠状态,每分钟醒来一次,检查所有储存的 crontab 文件,检查其中的每一条命令并适时执行。执行命令时,任何输出 通过邮件发往 crontab 的拥有者(如果 crontab 中设置了 MAILTO 环境变量,就发往此变量所指的用户)。 另外, cron 每分钟检查它的 spool 目录以及 /etc/crontab) 的 modtime 【译注:即文件的最新修改时间,在文件系 统 的 i-node 中以 mtime 标记】,如果发生变化, cron 将检查所有 crontab 文件的 modtime ,并重新加载已改变的。这 意味着即使修改 crontab 文件也没有必要重新启动 cron 守护程序。注意当 Crontab(1) 命令改变 crontab 时 会 刷 新 spool 目录的 modtime 标记。 另见 crontab(1), crontab(5) 作者 Paul Vixie
fhc2007@fhc2007-desktop:~$ ls -l /usr/bin/crontab
-rwxr-sr-x 1 root crontab 26928 2008-04-09 02:02 /usr/bin/crontab
CRONTAB(1) CRONTAB(1) NAME crontab - maintain crontab files for individual users (V3) SYNOPSIS crontab [ -u user ] file crontab [ -u user ] { -l | -r | -e } DESCRIPTION crontab is the program used to install, deinstall or list the tables used to drive the cron(8) daemon in Vixie Cron. Each user can have their own crontab, and though these are files in /var/spool/cron/crontabs, they are not intended to be edited directly. If the /etc/cron.allow file exists, then you must be listed there in order to be allowed to use this com- mand. If the /etc/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 this command. If neither of these files exists, then depending on site-dependent configuration parameters, only the super user will be allowed to use this com- mand, or all users will be able to use this command. For standard Debian systems, all users may use this command. If the -u option is given, it specifies the name of the user whose crontab is to be tweaked. If this option is not given, crontab examines "your" crontab, i.e., the crontab of the person executing the com- mand. Note that su(8) can confuse crontab and that if you are running inside of su(8) you should always use the -u option for safety's sake(目的, 缘故, 理由). The first form of this command is used to install a new crontab from some named file or standard input if the pseudo-filename ``-'' is given. The -l option causes the current crontab to be displayed on standard output. See the note under DEBIAN SPE- CIFIC below. 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 VISUAL or EDITOR envi- ronment variables. After you exit from the editor, the modified crontab will be installed automatically. If neither of the environment variables is defined, then the default editor /usr/bin/editor is used. DEBIAN SPECIFIC The "out-of-the-box" behaviour for crontab -l is to display the three line "DO NOT EDIT THIS FILE" header that is placed at the beginning of the crontab when it is installed. The problem is that it makes the sequence crontab -l | crontab - non-idempotent -- you keep adding copies of the header. This causes pain to scripts that use sed to edit a crontab. Therefore, the default behaviour of the -l option has been changed to not output such header. You may obtain the original behaviour by setting the environment variable CRONTAB_NOHEADER to 'N', which will cause the crontab -l command to emit the extraneous header. SEE ALSO crontab(5), cron(8) FILES /etc/cron.allow /etc/cron.deny
CRONTAB(5) CRONTAB(5) NAME crontab - tables for driving cron DESCRIPTION A crontab file contains instructions to the cron(8) daemon of the general form: ``run this command at this time on this date''. Each user has their own crontab, and commands in any given crontab will be executed as the user who owns the crontab. Uucp and News will usually have their own crontabs, eliminating the need for explicitly running su(1) as part of a cron command. Blank lines and leading spaces and tabs are ignored. Lines whose first non-space character is a hash-sign (#) are comments, and are ignored. Note that comments are not allowed on the same line as cron commands, since they will be taken to be part of the command. Similarly, comments are not allowed on the same line as environment variable settings. An active line in a crontab will be either an environment setting or a cron command. An environment set- ting is of the form, name = value where the spaces around the equal-sign (=) are optional (随意的), and any subsequent non-leading spaces in value will be part of the value assigned to name. The value string may be placed in quotes (single or double, but matching) to preserve (保持、保存) leading or trailing blanks. The value string is not parsed (分列) for environmental sub- stitutions (置换), thus lines like PATH = $HOME/bin:$PATH will not work as you might expect. Several environment variables are set up automatically by the cron(8) daemon. SHELL is set to /bin/sh, and LOGNAME and HOME are set from the /etc/passwd line of the crontab's owner. PATH is set to "/usr/bin:/bin". HOME, SHELL, and PATH may be overridden by settings in the crontab; LOGNAME is the user that the job is running from, and may not be changed. (Another note: the LOGNAME variable is sometimes called USER on BSD systems... on these systems, USER will be set also.) In addition to LOGNAME, HOME, and SHELL, cron(8) will look at MAILTO if it has any reason to send mail as a result of running commands in ``this'' crontab. If MAILTO is defined (and non-empty), mail is sent to the user so named. If MAILTO is defined but empty (MAILTO=""), no mail will be sent. Otherwise mail is sent to the owner of the crontab. On the Debian GNU/Linux system, cron supports the pam_env module, and loads the environment specified by /etc/security/pam_env.conf. However, the PAM setting do NOT override the settings described above nor any settings in the crontab file itself. Note in particular that if you want a PATH other than "/usr/bin:/bin", you will need to set it in the crontab file. By default, cron will send mail using the mail "Content-Type:" header of "text/plain" with the "charset=" parameter set to the charmap / codeset of the locale in which crond(8) is started up - ie. either the default system locale, if no LC_* environment variables are set, or the locale specified by the LC_* envi- ronment variables ( see locale(7)). You can use different character encodings for mailed cron job output by setting the CONTENT_TYPE and CONTENT_TRANSFER_ENCODING variables in crontabs, to the correct values of the mail headers of those names The format of a cron command is very much the V7 standard, with a number of upward-compatible extensions. Each line has five time and date fields, followed by a command, followed by a newline character ('n'). The system crontab (/etc/crontab) uses the same format, except that the username for the command is speci- fied after the time and date fields and before the command. The fields may be separated by spaces or tabs. Commands are executed by cron(8) when the minute, hour, and month of year fields match the current time, and when at least one of the two day fields (day of month, or day of week) match the current time (see ``Note'' below). cron(8) examines cron entries once every minute. The time and date fields are: field allowed values ----- -------------- minute 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) A field may be an asterisk (*) (星号通配符), which always stands for ``first-last''. Ranges of numbers are allowed. Ranges are two numbers separated with a hyphen (连接符). The specified range is inclusive (包含的). For example, 8-11 for an ``hours'' entry specifies execution at hours 8, 9, 10 and 11. Lists are allowed. A list is a set of numbers (or ranges) separated by commas (逗号). Examples: ``1,2,5,9'', ``0-4,8-12''. Step values can be used in conjunction (结合) with ranges. Following a range with ``/'' specifies skips of the number's value through the range. For example, ``0-23/2'' can be used in the hours field to specify command execution every other hour (the alternative in the V7 standard is ``0,2,4,6,8,10,12,14,16,18,20,22''). Steps are also permitted after an asterisk, so if you want to say ``every two hours'', just use ``*/2''. Names can also be used for the ``month'' and ``day of week'' fields. Use the first three letters of the particular day or month (case doesn't matter). Ranges or lists of names are not allowed. The ``sixth'' field (the rest of the line) specifies the command to be run. The entire command portion of the line, up to a newline or % character, will be executed by /bin/sh or by the shell specified in the SHELL variable of the crontab file. 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. There is no way to split a single command line onto multiple lines, like the shell's trail- ing "". Note: The day of a command's execution can be specified by two fields -- day of month, and day of week. If both fields are restricted (i.e., aren't *), the command will be run when either field matches the current time. For example, ``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. Instead of the first five fields, one of eight special strings may appear: 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 * * *". @midnight (same as @daily) @hourly Run once an hour, "0 * * * *". EXAMPLE CRON FILE # use /bin/bash to run commands, instead of the default /bin/sh SHELL=/bin/bash # 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" EXAMPLE SYSTEM CRON FILE This has the username field, as used by /etc/crontab. # /etc/crontab: system-wide crontab # Unlike any other crontab you don't have to run the `crontab' # command to install the new version when you edit this file # and files in /etc/cron.d. These files also have username fields, # that none of other the crontabs do. SHELL=/bin/sh PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin # m h dom mon dow user command 42 6 * * * root run-parts --report /etc/cron.daily 47 6 * * 7 root run-parts --report /etc/cron.weekly 52 6 1 * * root run-parts --report /etc/cron.monthly # # Removed invocation (调用) of anacron, as this is now handled by a # /etc/cron.d file SEE ALSO cron(8), crontab(1)
crontab的文件格式:
一个系统中的所有crontab文件都使用一种类似的格式,在每一行的第一列中使用“#”号来引入注释,每个非注释行包含了6或7个字段,它代表了一条命令:
minute hour day month weekday [username] command
前6个字段用空白符隔开,但在command字段中的空白符则按照原意对待。username 字段只出现在/etc/crontab文件和/etc/cron.d目录下的文件里,它指出命令应该以哪个用户的身份运行。这个字段不会也没有必要出现在用户自己的crontab文件中,因为文件名本身就暗含了UID。
minute、hour、day、month和weekday给出了关于命令应该何时运行的信息。它们的解释如下表:
时间范围可以包含一个步长值,例如,时间序列0、3、6 、9、12、15、18可以简洁的写成0-18/3。月份和日期的名字也可以使用易记的文字名,但此时不能连同“表示范围的方式”一起使用。
时间格式
45 10 * * 1-5
的意思是“上午10:45,从周一到周五”。提示:不要把星号放在第一个字段中,除非你想让这个命令每分钟都运行。
注意day字段和weekday字段有潜在的二义性。每一天既是星期中的一天,也是月中的一天。如果同时指定了day字段和weekday字段,满足两个条件之一的天就被选中。例如,
0,30 * 13 * 5
的意思是“星期五每半个小时,以及每月13号每半个小时”,而不是“既是13号又是星期五的那天每半个小时”。
command 就是要执行的sh命令行。它可以是任何有效的shell命令,而且不应该加引号。cron 认为 command 一直是到这行的末尾,它可以包含空格或制表符。
cron 使用百分号(%)来表示 command 字段中的换行。只有到第一个百分号前的文本才会包含在实际的命令中,其余则作为该命令的标准输入。
例如下面的一些合法的crontab命令:
echo The time is now `date` > /dev/console mail -s Reminder evi@ancor % Don't forget to write your chapters. cd /etc; /bin/mail -s "Password file" evi < passwd