crontab详解

cron 是一个可以用来根据时间、日期、月份、星期的组合来调度对重复任务的执行的守护进程。

cron 假定系统持续运行。如果当某任务被调度时系统不在运行,该任务就不会被执行。

要使用 cron 服务,你必须安装了 vixie-cron RPM 软件包,而且必须在运行 crond 服务。要判定该软件包是否已安装,使用 rpm -q vixie-cron 命令。要判定该服务是否在运行,使用 /sbin/service crond status 命令。

37.1.1. 配置 cron 任务

cron 的主配置文件是 /etc/crontab,它包括下面几行:

SHELL=/bin/bash
                  PATH=/sbin:/bin:/usr/sbin:/usr/bin
                  MAILTO=root
                  HOME=/
                  # run-parts
                  01 * * * * root run-parts /etc/cron.hourly
                  02 4 * * * root run-parts /etc/cron.daily
                  22 4 * * 0 root run-parts /etc/cron.weekly
                  42 4 1 * * root run-parts /etc/cron.monthly

前四行是用来配置 cron 任务运行环境的变量。SHELL 变量的值告诉系统要使用哪个 shell 环境(在这个例子里是 bash shell);PATH 变量定义用来执行命令的路径。cron 任务的输出被邮寄给 MAILTO 变量定义的用户名。如果 MAILTO 变量被定义为空白字符串(MAILTO=""),电子邮件就不会被寄出。HOME 变量可以用来设置在执行命令或脚本时使用的主目录。

/etc/crontab 文件中的每一行都代表一项任务,它的格式是:

minute         hour         day         month         dayofweek         command
  • minute — 分钟,从 0 到 59 之间的任何整数

  • hour — 小时,从 0 到 23 之间的任何整数

  • day — 日期,从 1 到 31 之间的任何整数(如果指定了月份,必须是该月份的有效日期)

  • month — 月份,从 1 到 12 之间的任何整数(或使用月份的英文简写如 jan、feb 等等)

  • dayofweek — 星期,从 0 到 7 之间的任何整数,这里的 0 或 7 代表星期日(或使用星期的英文简写如 sun、mon 等等)

  • command — 要执行的命令(命令可以是 ls /proc >> /tmp/proc 之类的命令,也可以是执行你自行编写的脚本的命令。)

在以上任何值中,星号(*)可以用来代表所有有效的值。譬如,月份值中的星号意味着在满足其它制约条件后每月都执行该命令。

整数间的短线(-)指定一个整数范围。譬如,1-4 意味着整数 1、2、3、4。

用逗号(,)隔开的一系列值指定一个列表。譬如,3, 4, 6, 8 标明这四个指定的整数。

正斜线(/)可以用来指定间隔频率。在范围后加上 /<integer> 意味着在范围内可以跳过 integer。譬如,0-59/2 可以用来在分钟字段定义每两分钟。间隔频率值还可以和星号一起使用。例如,*/3 的值可以用在月份字段中表示每三个月运行一次任务。

开头为井号(#)的行是注释,不会被处理。

如你在 /etc/crontab 文件中所见,它使用 run-parts 脚本来执行 /etc/cron.hourly/etc/cron.daily/etc/cron.weekly/etc/cron.monthly 目录中的脚本,这些脚本被相应地每小时、每日、每周、或每月执行。这些目录中的文件应该是 shell 脚本。

如果某 cron 任务需要根据调度来执行,而不是每小时、每日、每周、或每月地执行,它可以被添加到 /etc/cron.d 目录中。该目录中的所有文件使用和 /etc/crontab 中一样的语法。

# record the memory usage of the system every monday
                  # at 3:30AM in the file /tmp/meminfo
                  30 3 * * mon cat /proc/meminfo >> /tmp/meminfo
                  # run custom script the first day of every month at 4:10AM
                  10 4 1 * * /root/scripts/backup.sh

例 37-1. crontab 的例子

根用户以外的用户可以使用 crontab 工具来配置 cron 任务。所有用户定义的 crontab 都被保存在 /var/spool/cron 目录中,并使用创建它们的用户身份来执行。要以某用户身份创建一个 crontab 项目,登录为该用户,然后键入 crontab -e 命令,使用由 VISUALEDITOR 环境变量指定的编辑器来编辑该用户的 crontab。该文件使用的格式和 /etc/crontab 相同。当对 crontab 所做的改变被保存后,该 crontab 文件就会根据该用户名被保存,并写入文件 /var/spool/cron/username 中。

cron 守护进程每分钟都检查 /etc/crontab 文件、etc/cron.d/ 目录、以及 /var/spool/cron 目录中的改变。如果发现了改变,它们就会被载入内存。这样,当某个 crontab 文件改变后就不必重新启动守护进程了。

37.1.2. 控制对 cron 的使用

/etc/cron.allow/etc/cron.deny 文件被用来限制对 cron 的使用。这两个使用控制文件的格式都是每行一个用户。两个文件都不允许空格。如果使用控制文件被修改了,cron 守护进程(crond)不必被重启。使用控制文件在每次用户添加或删除一项 cron 任务时都会被读取。

无论使用控制文件中的规定如何,根用户都总是可以使用 cron。

如果 cron.allow 文件存在,只有其中列出的用户才被允许使用 cron,并且 cron.deny 文件会被忽略。

如果 cron.allow 文件不存在,所有在 cron.deny 中列出的用户都被禁止使用 cron。

37.1.3. 启动和停止服务

要启动 cron 服务,使用 /sbin/service crond start 命令。要停止该服务,使用 /sbin/service crond stop 命令。推荐你在引导时启动该服务。

由于Cron 是Linux的内置服务,可以用以下的方法启动、关闭这个服务:

/sbin/service crond start //启动服务
/sbin/service crond stop //关闭服务
/sbin/service crond restart //重启服务
/sbin/service crond reload //重新载入配置

。。。。。


crontab在/etc目录下面存在cron.d,cron.daily,cron.weekly,cron.monthly,cron.hourly五个目录和crontab,cron.deny二个文件。

cron.daily是每天执行一次的job,cron.weekly是每个星期执行一次的job.
cron.monthly是每月执行一次的job,cron.hourly是每个小时执行一次的job.

cron.d是系统自动定期需要做的任务,但是又不是按小时,按天,按星期,按月来执行的,那么就放在这个目录下面。
如果是按小时,按天,按星期,按月的来执行的话,则可以放到前面相应的目录下面去。


那么有人也许会问,前面按天,按星期,按月执行的job,到底是什么时候去自动执行呢?
通过察看/etc/crontab文件就很清楚了:
[admin@c2c_std etc]$ cat crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

/etc/cron.deny文件就是用于控制不让哪些用户使用Crontab的功能。


另外在/var/spool下面存在着两个目录cron,anacron。
其中cron目录下面有每个用户的自己通过crontab -e增加的crontab的内容。

anacron目录下面是记录的是cron.daily,cron.monthly,cron.weekly的上一次执行的时间。


linux的cron服务是每隔一分钟去读取一次/var/spool/cron,/etc/crontab,/etc/cron.d下面所有的内容。


在linux系统上,默认情况下在/etc/cron.daily目录下面存在以下文件:
-rwxr-xr-x 1 root root 286 Aug 14 2004 tmpwatch
-rwxr-xr-x 1 root root 276 Sep 29 2004 0anacron
-rwxr-xr-x 1 root root 2133 Dec 1 2004 prelink
-rwxr-xr-x 1 root root 180 Jul 13 2005 logrotate
-rwxr-xr-x 1 root root 121 Aug 9 2005 slocate.cron
-rwxr-xr-x 1 root root 48 Apr 10 2006 mcelog.cron
-rwxr-xr-x 1 root root 418 Apr 14 2006 00-makewhatis.cron
-rwxr-xr-x 1 root root 104 May 31 2006 rpm
lrwxrwxrwx 1 root root 28 Apr 7 08:25 00-logwatch -> ../log.d/scripts/logwatch.pl

这里有些东西是很耗资源的,可以考虑去掉。
tmpwatch的作用是清除掉一些长时间没有访问的临时文件。这个留着。
0anacron的作用是更新crontab job的执行时间,这个必须要留着。它在名称的前面另上0,以保证这个程序会在
其他程序前执行。并且这个被run-parts自动调用。

prelink的作用是预链接一些动态链接库和可执行文件,以此来加快启动时间和减少run-time的内存分配,有点类似于oracle
的dbms_shared_pool.keep的作用一样。这个东西是个双刃剑。

logrotate的作用循环利用,压缩一些系统日志的,还是留着。

slocate.cron的作用更新slocate database,用于为locate服务的,很消耗资源,可以停掉。

mcelog.cron的作用是用于生成/var/log/mcelog文件,留着。

00-makewhatis.cron的作用是创建whatis database,用于为whatis服务的。较为消耗资源,可以去掉。
这个在cron.weekly里面也存在,这里面的也可以去掉。

rmp的作用是每天将系统上安装过的rpm包的信息放到/var/log/rpmpkgs中去。这个没什么用处,可以去掉。

00-logwatch 的作用是用于监控linux log文件的。可以留着。

参考:http://www.cnblogs.com/jiafan/articles/1153066.html

run-parts命令的用法及原理

    在很多系统中,用户目录下都有cron.daily之类的文件夹,里面的可执行文件每天都会被执行一次。也就是说如果想添加一个每天都被执行的任务的话,在目录下放置该任务的脚本即可。使用很方便,原理是什么呢,就是run-parts命令。
    在centos5下,run-parts命令位于/usr/bin/run-parts,内容是很简单的一个shell脚本,就是遍历目标文件夹,执行第一层目录下的可执行权限的文件。、

#!/bin/bash

# run-parts - concept taken from Debian

# keep going when something fails
set +e

if [ $# -lt 1 ]; then
    echo "Usage: run-parts <dir>"
    exit 1
fi

if [ ! -d $1 ]; then
    echo "Not a directory: $1"
    exit 1
fi

# Ignore *~ and *, scripts
for i in $1/*[^~,] ; do
    [ -d $i ] && continue
    # Don't run *.{rpmsave,rpmorig,rpmnew,swp} scripts
    [ "${i%.rpmsave}" != "${i}" ] && continue
        [ "${i%.rpmorig}" != "${i}" ] && continue
        [ "${i%.rpmnew}" != "${i}" ] && continue
        [ "${i%.swp}" != "${i}" ] && continue
    [ "${i%,v}" != "${i}" ] && continue

    if [ -x $i ]; then
        $i 2>&1 | awk -v "progname=$i" 
                  'progname {
                   print progname ":
"
                   progname="";
                   }
                   { print; }'
    fi
done

exit 0

 在ubuntu下,该文件位于/bin/run-parts,是个二进制文件,功能更为强大,支持--test等参数。

/etc/cron.d是什么文件

在/etc目录下,有5个以cron开头的目录:
1. /etc/cron.hourly
2. /etc/cron.daily
3. /etc/cron.weekly
4. /etc/cron.monthly
5. /etc/cron.d

前面4个目录都有在/etc/crontab配置文件中用到:

  1. # m h dom mon dow user    command
  2. 17 *    * * *    root    cd / && run-parts --report /etc/cron.hourly
  3. 25 6    * * *    root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
  4. 47 6    * * 7    root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
  5. 52 6    1 * *    root    test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
复制代码

例如,我们将每天都要执行的脚本文件放到/etc/cron.daily目录,这样cron守护进程就会在每天早上的6:25开始执行该目录下的所有脚本。

cron.d文件夹是和crontab一样的放置例行性工作指令的地方,二者选一。不过cron.d用于更多细节的处理此目录有命名规则,文件名由大小写字母,数字,横杠和下划线组成,不包括圆点


当我们要增加全局性的计划任务时,一种方式是直接修改/etc/crontab。
但是,一般不建议这样做,/etc/cron.d目录就是为了解决这种问题而创建的。
例如,增加一项定时的备份任务,我们可以这样处理:在/etc/cron.d目录下新建文件python-backup,内容如下:

  1. # m h dom mon dow user command
  2. 26 16 * * * root tar zcvf /var/backups/home.tar.gz /home/amonest/python
复制代码

cron进程执行时,就会自动扫描该目录下的所有文件,按照文件中的时间设定执行后面的命令。

cron执行时,也就是要读取三个地方的配置文件:一是/etc/crontab,二是/etc/cron.d目录下的所有文件,三是每个用户的配置文件.

参考:http://bbs.chinaunix.net/thread-3753934-1-1.html

如果某 cron 任务需要根据调度来执行,而不是每小时、每日、每周、或每月地执行,它可以被添加到/etc/cron.d目录中。该目录中的所有文件使用和 /etc/crontab 中一样的语法。

Linux cron、crontab计划任务、run-parts

cron ['krɔn] n. [计量] 克龙(时间单位,百万年)计划任务

本机使用的CentOS下的命令名叫/usr/sbin/crond

cron是Linux下的计划任务工具,它是linux的服务器端程序。cron启动后,它会读取它的所有配置文件(全局性配置文件/etc/crontab,以及每个用户的计划任务配置文件)每分钟读一次???,然后cron会根据命令和执行时间来按时来调用度工作任务。
Notice that tasks will be started based on the cron's system daemon's notion of time and timezones

cron服务的启动关闭
启动:service cron start
停止:service cron stop
重启:service cron restart
查看状态:service cron status
重新载入配置:service cron reload

你也可以将这个服务在系统启动的时候自动启动:
在/etc/rc.d/rc.local这个脚本的末尾加上:
/sbin/service cron start

cron服务提供crontab命令来设定cron服务的,以下是这个命令的一些参数与说明:
crontab -u //设定某个用户的cron服务,一般root用户在执行这个命令的时候需要此参数
crontab -l //列出某个用户cron服务的详细内容
crontab -r //删除某个用户的cron服务
crontab -e //编辑某个用户的cron服务 
比如说root查看自己的cron设置:crontab -u root -l
再例如,root想删除fred的cron设置:crontab -u fred -r

每次编辑完某个用户的cron设置后,cron自动在/var/spool/cron下生成一个与此用户同名的文件,此用户的cron信息都记录在这个文件中,这个文件是不可以直接编辑的,只可以用crontab -e 来编辑。cron启动后每过一份钟读一次这个文件,检查是否要执行里面的命令。因此此文件修改后不需要重新启动cron服务

全局性配置文件:
# m h dom mon dow user command
用户自身配置文件
# m h  dom mon dow   command

m 分钟 (0-59)
h 小時 (0-23)
dom 日期 (1-31)
mon 月份 (1-12)
dow 星期 (0-6)//0代表星期天
*代表所有的取值范围内的数字,"/"代表每的意思,"*/5"表示每5个单位,"-"代表从某个数字到某个数字,","分开几个离散的数字。

每天早上6点
0 6 * * * echo "Good morning." >> /tmp/test.txt //注意单纯echo,从屏幕上看不到任何输出,因为cron把任何输出都email到root的信箱了。
每两个小时
0 */2 * * * echo "Have a break now." >> /tmp/test.txt
晚上11点到早上8点之间每两个小时,早上八点
0 23-7/2,8 * * * echo "Have a good dream:)" >> /tmp/test.txt
每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点
0 11 4 * 1-3 command line
1月1日早上4点
0 4 1 1 * command line



cron 的主配置文件是 /etc/crontab,它包括下面几行
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/

# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly

前四行是用来配置 cron 任务运行环境的变量。SHELL 变量的值告诉系统要使用哪个 shell 环境(在这个例子里是 bash shell);PATH 变量定义用来执行命令的路径。cron 任务的输出被邮寄给 MAILTO 变量定义的用户名。如果 MAILTO 变量被定义为空白字符串(MAILTO=""),电子邮件就不会被寄出。HOME 变量可以用来设置在执行命令或脚本时使用的主目录。

如你在 /etc/crontab 文件中所见,它使用 run-parts 脚本来执行 /etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly 和 /etc/cron.monthly 目录中的脚本,这些脚本被相应地每小时、每日、每周、或每月执行。这些目录中的文件应该是 shell 脚本。

如果某 cron 任务需要根据调度来执行,而不是每小时、每日、每周、或每月地执行,它可以被添加到/etc/cron.d目录中。该目录中的所有文件使用和 /etc/crontab 中一样的语法。

 
原文地址:https://www.cnblogs.com/Alight/p/3579850.html