关于cron

cron程序

cron程序用来周期性地启动某些进程。它通常使用crond程序或者crontab程序进行控制,你可以简单地把crond守护进程和crontab程序看成一个,它们实际是用同样的方式执行的,只是方法不同。

要使用cron的功能,首先需要启动crond守护进程,   我们先介绍最简单的设置cron的办法。在Linux系统中,cron程序的行为由/etc/crontab文件控制,这个文件由若干个部分组成,一般情 况下,它包括设置执行参数的部分和实际的命令部分,我们用一个示意性的crontab文件来描述它的基本格式:

#/etc/crontab

SHELL=/bin/bash

PATH=/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=root

HOME=/

在一串#上面的部分是为cron设置的环境,这个环境现在设置的是使用bash。其他行的意义一目了然。

cron的执行语句,每个语句占据一行,代表一个作业设置,行可以由6个或者7个栏目构成,7个栏目的语句格式是

[分钟] [小时] [日期] [月份] [周中的天数] [用户] [命令]      分钟和小时就是你准备执行命令的钟点,日期则指的是月中的日期

例如,一个典型的crontab登记项可以写成      30 4 1 * * root rm -f /var/log/httpd/*

这里的五个时间域有两个是*号,表示通配,因此这里的时间域就是每个月的1日早晨4:30,执行命令的用户身份是root,后面的部分是命令。连起 来就是在每个月的1日4:30自动删除/var/log/httpd下面的所有文件。容易看出问题发生在同时设置日期和星期几的两个域的时候。例如,0 0 13 * 5到底是代表每月的13日零点,还是每星期五的零点,或者必须是“黑色的星期五”才能执行呢?     答案是这样的一个写法代表所有的13日加上所有的星期五都会执行这个命令。这一点是比较容易出现问题的地方。

当你书写crontab文件时一定要注意,crond程序设计得比较成问题,它要求每行必须以回车结尾:你可以在文件末尾加上几个空行,这不会影响crond运行,但是如果你的最后一行忘了加上一个回车,那么crond程序将会忽略这一行,不去执行对应的作业。

每个时间域都可以使用列表来设置多个值,例如,你想让某个任务在每天的2:00,4: 00和6:00运行,那么时间域的部分应该写成      0 2,4,6 * * *      另外一个常用的cron时间域符号是/,它代表“每”。举个例子来说,你想让某个任务每隔5分钟执行一次,当然你可以在分钟域中用 0,5,10,15,20,….55来处理这个问题, 但是你也可以用这样的方式来设置时间域:     */5 * * * *     在时间域中,可以使用减号代表集合,例如,在小时域中的8-12和8,9,10,11,12是等价的。

也可以用六个域来表示crontab表项,这时用户身份项被省略,其他各项的含义不变。     一般情况下,只要crond守护进程在运行中,它会每隔1分钟察看一次/etc/crontab文件,因此你修改了crontab文件之后不需要重新启动 crond程序,只要简单地等待就可以发现crond会刷新它的列表。如果发生了什么不寻常的事情,或者crond程序没有完成你设定的作业,你可以察看 /var/log/cron文件查阅问题的原因。     上面解释的是系统的cron作业设置,每个用户还可以设置自己的cron作业表。比如, 我是某个用户,我想每隔5分钟在虚拟控制台1上显示一下当前时间,那么我可以建立这样的一个文件:      */5 * * * * date > /dev/tty1      同样,回车符是不可缺少的。假设文件名字为testcron,然后用crontab命令设置作业表:      crontab testcron      这样就可以了。      同样,任何一个用户都可以建立自己的cron文件。

要察看某个用户自己设置的作业,使用crontab命令的-l-u 开关:      # crontab -l

要清除自己的作业列表,使用crontab -r命令。

crontab执行相关的权限文件有两个,分别是/etc/cron.allow和/etc/cron.deny。如果cron.allow文件存 在,系统试图从中读出可以执行crontab命令的用户名字,其他的用户(除了root)都无法使用这个命令;否则,如果cron.allow文件不存 在,系统将寻找/etc/cron.deny文件,如果存在的话,那么系统认为所有人都可以执行crontab命令,除了列在/etc /cron.deny中的用户;最后,如果这两个文件都不存在,除了root以外的其他用户将无法使用crontab命令.

at守护进程

at程序是另外一种管理作业的工具,与crond程序不同,at调度程序是设置程序在设定好的某个时刻执行,但是只执行一次。 要使用at调度程序,必须首先启动atd守护进程,语法很简单:      #/usr/sbin/atd      然后就可以用at命令调度作业了,例如,对我们想在三个小时之后, 也就是1:00开始这个进程(假设进程的名字是cpu_killer),那么,可以这样使用at命令:      $ at now + 3 hours      这里设置程序将在三个小时之后执行,也可以使用明确的时间:      $ at 1:00 kill_cpu     无论哪一种情况,都会出现at命令的提示符:      at>      可以输入命令:      at> kill_cpu      at>      在这个提示符下可以输入多个命令,直到你按下^D组合键:      at>       warning: commands will be executed using /bin/sh      job 2 at 2000-12-31 04:00       at命令的一般语法是      at [时间] [命令]      时间参数是启动命令的时间。at命令认识类似下面形式的命令:      1930 December 5   表示12月5日晚上19点30分      19:30 December 5 跟刚才的形式等效      11:00 pm    表示夜间23:00      11:00 P   同上      now + 1 week   从现在开始一周以后      4:30 Tuesday next week 下星期二4:30      5:15 12/05/2000         2000年12月5日早晨5:15        不是每个用户都可以使用at调度作业。

与at执行相关的权限文件有两个,分别是/etc/at.allow和/etc/at.deny。如果at.allow文件存在,系统试图从中读出 可以执行at命令的用户名字,其他的用户(除了root)都无法使用这个命令;否则,如果at.allow文件不存在,系统将寻找/etc /at.deny文件,如果存在的话,那么系统认为所有人都可以执 行at命令,除了列在/etc/at.deny中的用户;最后,如果这两个文件都不存在,除了root以外的其他用户将无法使用at命令。

 

摘自: http://hi.baidu.com/ezrax/blog/item/51caca06c7cc857f03088145.html

 

更多参考: http://zh.wikipedia.org/wiki/CRON

测试例子:

该cron是 2012年7月30号21点08分设置的,当日星期一,执行文件内容如下:

Mon Jul 30 21:09:01 CST 2012
Mon Jul 30 21:10:01 CST 2012
Mon Jul 30 21:11:01 CST 2012

 

看来,月份、日期和周之间确实是 “或” 的关系

 

留下评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据