Linux定时工具--crontab

以下都来源man手册。

Crontab命令

man 1 crontab

如何使用crontab命令

CRONTAB(1)                                   General Commands Manual                                  

NAME

       crontab - maintain crontab files for individual users (Vixie Cron)

         每个用户有单独的crontab文件。

SYNOPSIS

       crontab [ -u user ] file

       crontab [ -u user ] [ -i ] { -e | -l | -r }

DESCRIPTION

         每个用户有自己的crontab文件,放在/var/spool/cron/crontabs,   Crontab文件不应该直接编辑,应该使用crontab –e。

         如果存在/etc/cron.allow文件,则必须在其中列出您(每行一个用户),以便允许使用此命令。 如果/etc/cron.allow文件不存在,但/etc/cron.deny文件存在,则必须在/etc/cron.deny文件中未列出您才能使用此命令。

         如果这些文件都不存在,则取决于站点相关的配置参数,将仅允许超级用户使用此命令,或者所有用户都将能够使用此命令。

         如果两个文件都存在,则/etc/cron.allow优先。 这意味着不考虑/etc/cron.deny,并且必须在/etc/cron.allow中列出您的用户才能使用crontab。

         无论这些文件是否存在,始终允许根管理用户设置crontab。 对于标准Debian系统,所有用户都可以使用此命令。

 

         如果给出了-u选项,则它指定了将使用的crontab的用户名,用于-l和-e选项。如果未指定此选项,则crontab会检查执行命令的人的crontab。请注意        

         如果指定了伪文件名``-'',则此命令的第一种形式用于从某些命名文件或标准输入中安装新的crontab。

 

         -l选项使当前crontab显示在标准输出上        

         -r选项导致删除当前的crontab。

         -e选项用于编辑当前crontab。从编辑器退出后,将自动安装修改后的crontab。

         -i选项修改了-r选项,以在实际删除crontab之前提示用户“ y / Y”响应。

示例:

         执行crontab –l显示/var/spool/cron/crontabs/root,如果用户是root.

root@debian:~# crontab -l

# Edit this file to introduce tasks to be run by cron.

#

# Each task to run has to be defined through a single line

# indicating with different fields when the task will be run

# and what command to run for the task

#

# To define the time you can provide concrete values for

# minute (m), hour (h), day of month (dom), month (mon),

# and day of week (dow) or use '*' in these fields (for 'any').#

# Notice that tasks will be started based on the cron's system

# daemon's notion of time and timezones.

#

# Output of the crontab jobs (including errors) is sent through

# email to the user the crontab file belongs to (unless redirected).

#

# For example, you can run a backup of all your user accounts

# at 5 a.m every week with:

# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/

#

# For more information see the manual pages of crontab(5) and cron(8)

#

# m h  dom mon dow   command

* * * * * ls / > /tmp/ls.txt

 

Crontab配置文件格式

CRONTAB(5)                                     File Formats Manual                                    CRONTAB(5)

man 5 crontab

NAME

       crontab - tables for driving cron

DESCRIPTION

         一个crontab文件包含对cron(8)守护程序的说明,其格式如下:

         “在某时某刻执行某命令”。

         每个用户都有自己的crontab,任何给定crontab中的命令都将以拥有crontab的用户身份执行。

         crontab文件中,空行以及前导空格和制表符将被忽略。第一个非空格字符为井号(#)的行为注释,并被忽略。请注意,注释不能与cron命令放在同一行,因为它们将被视为命令的一部分。同样,注释与环境变量设置不得在同一行。

         crontab中的活动行将是环境设置或cron命令。 crontab文件是从上到下解析的,因此任何环境设置都将仅影响文件中位于它们下方的cron命令。环境设置具有以下形式:

         name = value

         其中等号(=)周围的空格是可选的,并且值中任何后续的非前导空格都将是分配给name的值的一部分。可以将值字符串放在引号中(单引号或双引号,但匹配),以保留前导或尾随空格。要定义一个空变量,必须使用引号。

         无法解析值字符串以进行环境替换或变量替换,因此类似

                   PATH = $ HOME / bin:$ PATH

         可能无法正常工作。下面这样也行不通

           A = 1

           B = 2

           C = $ A $ B

         最后一个值中将不会有任何替代已定义的变量。

         〜 可以替换为$ HOME,因此,如果将bash用于任务,则可以使用以下命令:

            SHELL = / bin / bash

            PATH =〜/ bin:/ usr / bin / :: / bin

         cron(8)守护程序会自动设置几个环境变量。 SHELL设置为/ bin / sh,LOGNAME和HOME从crontab所有者的/ etc / passwd行设置。 PATH设置为“ / usr / bin:/ bin”。 HOME,SHELL和PATH可能会被crontab中的设置覆盖; LOGNAME是运行作业的用户,并且不能更改。

         除了LOGNAME,HOME和SHELL外,如果由于在``this''crontab中运行命令而有任何理由发送邮件,cron(8)还将查看MAILTO环境变量。如果定义了MAILTO(并且是非空的),则将邮件发送给如此命名的用户。通过用逗号分隔收件人用户,MAILTO还可以用于将邮件定向到多个收件人。如果定义了MAILTO但为空(MAILTO =“”),则不会发送任何邮件。否则,邮件将发送到crontab的所有者。

         在Debian GNU / Linux系统上,cron支持pam_env模块,并加载/ etc / environment和/etc/security/pam_env.conf指定的环境。它还从/ etc / default / locale读取语言环境信息。但是,PAM设置不会覆盖上述设置,也不会覆盖crontab文件本身中的任何设置。请特别注意,如果您想要的路径不是“ / usr / bin:/ bin”,则需要在crontab文件中进行设置。

         默认情况下,cron将使用“ text / plain”的邮件“ Content-Type:”标题发送邮件,并将“ charset =”参数设置为启动crond(8)的语言环境的charmap /代码集。 。如果未设置LC_ *环境变量,则为默认系统语言环境,或者由LC_ *环境变量指定的语言环境(请参见locale(7))。通过将crontabs中的CONTENT_TYPE和CONTENT_TRANSFER_ENCODING变量设置为这些名称的邮件头的正确值,可以为邮件cron作业输出使用不同的字符编码。

         cron命令的格式非常类似于V7标准,具有许多向上兼容的扩展名。每行都有五个时间和日期字段,后跟一个命令,后跟一个换行符('\ n')。系统crontab/ etc / crontab)使用相同的格式,除了在时间和日期字段之后以及命令之前指定命令的用户名。这些字段可以用空格或制表符分隔。命令字段的最大允许长度为998个字符。

         时间参数的范围:

             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)

        操作符:

         * 取值范围内的所有数字

         / 每过多少个数字,步长

         - 从X到Z,区段

         ,散列数字,列表

         名称也可以用于``月''和``星期几''字段。使用特定日期或月份的前三个字母(大小写无关)。不允许使用名称范围或名称列表。

         ``第六个''字段(该行的其余部分)指定要运行的命令。该行的整个命令部分(最多换行符或%字符)将由/ bin / sh或crontab文件的SHELL变量中指定的shell执行。除非使用反斜杠(\)进行转义,否则命令中的百分号(%)将被更改为换行符,并且第一个%之后的所有数据将作为标准输入发送至命令。无法将单个命令行拆分为多行,例如shell中常用的“ \”也不行。

         注意:命令的执行日期可以由两个字段指定-月份的日期和星期几。

         如果两个字段都受限制(即不是*),则当任一字段与当前时间匹配时,将运行该命令。例如,``30 4 1,15 * 5'' 将导致一个命令在每月的1号和15号以及每个星期五的凌晨4:30运行。

         前五个时间字段中,可能会出现八个特殊字符串之一:

         string         meaning

         ---------------------------------------------------------

         @reboot        Run once, at startup. 指的是cron(8)守护程序启动的时间

         @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"

         # Run on every second Saturday of the month

         0 4 8-14 * *    test $(date +\%u) -eq 6 && echo "2nd Saturday"

EXAMPLE SYSTEM CRON FILE

         /etc/cron.hourly下的脚本会被每小时运行一次,在每小时的17分时运行。
       /etc/cron.daily下的脚本会被每天运行一次,在每天625分运行。
       /etc/cron.weekly下的脚本会被每周运行一次,在每周第7天的647分运行。
       /etc/cron.monthly下的脚本会被每月运行一次,在每月1号的652分运行。

dom : day of month

dow : day of week

run-parts:run scripts or programs in a directory

注意,run-parts执行的脚本不能是.sh结尾。

LIMITATIONS

         cron守护程序以定义的时区运行。它当前不支持按用户时区。所有任务:系统任务和用户任务都将根据配置的时区运行。即使用户在其crontab中指定了TZ环境变量,这也只会影响crontab中执行的命令,而不会影响crontab任务本身的执行。

         crontab语法无法定义一个可能成像的所有可能时间段。例如,定义一个月的最后一个工作日并不容易。如果任务需要在crontab语法中无法定义的特定时间段内运行,则最好的方法是让程序本身检查日期和时间信息并仅在该时间段与所需时间段匹配时才继续执行。

         cron要求crontab中的每个条目都以换行符结尾。 如果crontab中的最后一个条目缺少换行符(即,被EOF终止),则cron将认为crontab(至少部分)损坏。 警告将被写入syslog。

Cron守护进程

Man 8 cron

CRON(8)             System Manager's Manual                      CRON(8)

NAME

         cron - daemon to execute scheduled commands (Vixie Cron)

SYNOPSIS

         cron [-f] [-l] [-L loglevel]

DESCRIPTION

         cron is started automatically from /etc/init.d on entering multi-user runlevels.

OPTIONS

         -f       保持前台模式,不进行守护进程。

         -l       为/etc/cron.d文件启用LSB兼容名称。但是,此设置不会影响在/etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly或/etc/cron.monthly下的文件解析。

         -n     发送邮件时在主题中包括FQDN。默认情况下,cron将缩写主机名。

         -L     loglevel

                   Tell  cron  what to log about jobs (errors are logged regardless of this value) as the sum of the following values:

 

                   1      will log the start of all cron jobs

                   2      will log the end of all cron jobs

                   4      will log all failed jobs (exit status != 0)

                   8      will log the process number of all cron jobs

 

                   The default is to log the start of all jobs (1). Logging will be disabled if  levels  is  set  to zero (0). A value of fifteen (15) will select all options.

NOTES

         cron在其/ var / spool / cron / crontabs中搜索用户名对应的crontab文件(以/ etc / passwd中的帐户命名);找到crontabs文件加载到内存中。请注意,不应直接访问此目录中的crontabs,应该使用crontab命令访问和更新它们。

         cron还会读取/ etc / crontab,其格式略有不同(请参阅crontab(5))。在Debian中,/ etc / crontab的内容被预定义为在/etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly和/etc/cron.monthly下运行程序。此配置特定于Debian,请参见下面的DEBIAN SPECIFIC下的注释。        

         另外,Debian中,cron读取/etc/cron.d目录中的文件。 cron将/etc/cron.d中的文件与/ etc / crontab文件一样对待(它们遵循该文件的特殊格式,即它们包括用户字段)。但是,它们独立于/ etc / crontab:例如,它们不从中继承环境变量设置。

         与/ etc / crontab一样,/etc/cron.d目录中的文件也受到监视以进行更改。通常,系统管理员不应使用/etc/cron.d/,而应使用标准系统crontab  /etc/crontab。

         /etc/crontab和/etc/cron.d中的文件必须由root拥有,并且不能是组可写或其他可写的。与spool area相比,/ etc / cron.d、/etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly和/etc/cron.monthly下的文件也可能是符号链接,前提是符号链接及其指向的文件均由root拥有。 /etc/cron.d下的文件不需要是可执行文件,而/etc/cron.hourly下的文件/etc/cron.daily、/etc/cron.weekly和/etc/cron.monthlydo都可以,因为它们由run-parts运行。

         然后,cron每分钟唤醒一次,检查所有存储的crontab,检查每个命令以查看是否应在当前分钟内运行。执行命令时,任何输出都将邮寄到crontab的所有者(或crontab的MAILTO环境变量中命名的用户,如果存在的话)。

         当时钟更改时间少于3小时时(例如,夏令时的开始和结束),存在一些特殊的注意事项。 如果时间向前推进,则原本可以跳过的作业将在更改后立即运行。 相反,如果时间倒退不到3小时,则属于重复时间的那些作业将不会重新运行。

         仅在特定时间运行的作业(未指定为@hourly,也没有在小时或分钟说明符中使用'*')会被影响。 使用通配符指定的作业将立即基于新时间运行。

         超过3小时的时钟变化被认为是对时钟的更正,并且新时间将立即使用。

         cron将其操作记录到syslog工具'cron'中,并且可以使用标准sys-logd(8)工具来控制日志记录。

ENVIRONMENT

         如果在Debian系统中的/ etc / default / cron中进行了配置,则可以通过使用/ etc / environment或通过使用/ etc / default / locale来管理cron守护程序本地化设置环境,后者的值将覆盖 前任的。 将读取这些文件,并将它们用于设置LANG,LC_ALL和LC_CTYPE环境变量。 然后,这些变量用于设置邮件的字符集,默认为“ C”。

         这不会影响在cron下运行的任务的环境。 有关如何修改任务环境的更多信息,请参阅crontab(5)

         守护程序将使用/ etc / timezone中的时区定义(如果存在)。

         可以在用户的crontab定义中重新定义环境,但是cron仅在单时区处理任务。

DEBIAN SPECIFIC

         Debian   most significant  changes introduced are:

         —      Support for /etc/cron.{hourly,daily,weekly,monthly} via /etc/crontab,

         —      Support for /etc/cron.d (drop-in dir for package crontabs),

         —      PAM support,

         —      SELinux support,

         —      auditlog support,

         —      DST and other time-related changes/fixes,

         —      SGID crontab(1) instead of SUID root,

         —      Debian-specific file locations and commands,

         —      Debian-specific configuration (/etc/default/cron),

         —      numerous other smaller features and fixes.

 

         Debian通过/etc/crontab文件的默认设置提供对/etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly和/etc/cron.monthly的支持(请参阅系统范围内的内容)。 crontab(5)中的示例)。

         系统范围的默认crontab包含四个任务:每小时,每天,每周和每月运行。这些任务中的每一个都将执行运行部分,并提供每个目录作为参数。

         如果安装了anacron(每小时任务除外),则会禁用这些任务,以防止两个守护程序之间发生冲突。

         如上所述,这些目录下的文件必须通过一些健全性检查,包括以下各项:可执行文件,由root拥有,不可由组或其他用户写入,并且如果是符号链接,则指向root拥有的文件。此外,文件名必须符合运行部件的文件名要求

         它们必须完全由字母,数字组成,并且只能包含特殊符号下划线(_)和连字符(-)。不符合这些要求的任何文件都不会由运行部件执行。例如,任何包含点的文件都将被忽略。这样做是为了防止cron在处理/etc/cron.d/中的文件作为配置文件(例如,以.dpkg-dist,.dpkg-orig结尾的文件,和.dpkg-new)。

         系统管理员和程序包可以使用此功能,以包括将按定义的时间间隔运行的任务。由这些目录中的程序包创建的文件应以提供它们的程序包命名。

         对/etc/cron.d的支持包含在cron守护程序本身中,该守护程序将该位置作为系统级crontab spool处理。该目录可以包含遵循/etc/crontab中使用的格式的任何文件定义任务,即与用户cron假脱机不同,这些文件必须提供用户名以像任务定义中那样运行任务。

         该目录中的文件必须由root拥有,不需要是可执行文件(它们是配置文件,就像/ etc / crontab一样),并且必须符合run-parts(8)使用的相同命名约定:

         它们只能由大写和小写字母,数字,下划线和连字符组成。这意味着它们不能包含任何点。如果将-l选项指定为cron(可以通过/ etc / default / cron设置此选项,请参见下文),则它们必须符合LSB命名空间规范,与run-parts中的--lsbsysinit选项完全相同。

         此功能的预期目的是允许需要比/ etc / cron更好地控制其调度的软件包。{每小时,每天,每周,每月}目录将crontab文件添加到/etc/cron.d。这样文件应以提供它们的软件包的名字命名。

         另外,cron的默认配置由/ etc / default / cron控制,该文件由启动cron守护程序的init.d脚本读取。该文件确定cron是否将读取系统的环境变量,并使其可以在cron程序执行之前添加其他选项,以配置其日志记录或定义如何处理/ etc / crond下的文件。

SEE ALSO

       crontab(1), crontab(5), run-parts(8)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值