一.crond命令

crond 是linux用来定期执行程序的命令。当安装完成操作系统之后,默认便会启动此任务调度命令。crond命令每分锺会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。

       /sbin/service crond start    //启动服务

  /sbin/service crond stop     //关闭服务
  /sbin/service crond restart  //重启服务

  /sbin/service crond reload   //重新载入配置

      /sbin/service crond status   //查看服务状态

crond读取一个或多个配置文件,这些配置文件中包含了命令行及其调用时间。

crond的配置文件称为“crontab”,是“cron table”的简写。


二.crond在3个地方查找配置文件
1、/var/spool/cron/ 这个目录下存放的是每个用户包括root的crontab任务,每个任务以创建者的名字命名,比如tom建的crontab任务对应的文件就是/var/spool/cron/tom。
一般一个用户最多只有一个crontab文件。
2、/etc/crontab 这个文件负责安排由系统管理员制定的维护系统以及其他任务的crontab。
3、/etc/cron.d/ 这个目录用来存放任何要执行的crontab文件或脚本。


三.权限
crontab权限问题到/var/adm/cron/下一看,文件cron.allow和cron.deny是否存在
用法如下: 
1、如果两个文件都不存在,则只有root用户才能使用crontab命令。 
2、如果cron.allow存在但cron.deny不存在,则只有列在cron.allow文件里的用户才能使用crontab命令,如果root用户也不在里面,则root用户也不能使用crontab。 
3、如果cron.allow不存在, cron.deny存在,则只有列在cron.deny文件里面的用户不能使用crontab命令,其它用户都能使用。 
4、如果两个文件都存在,则列在cron.allow文件中而且没有列在cron.deny中的用户可以使用crontab,如果两个文件中都有同一个用户,
以cron.allow文件里面是否有该用户为准,如果cron.allow中有该用户,则可以使用crontab命令。


四. crontab命令

crond服务提供crontab命令来设定crond服务的,以下是这个命令的一些参数与说明:

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

五.配置crontab

可用crontab -e命令来编辑,编辑的是/var/spool/cron下对应用户的cron文件,也可以直接修改/etc/crontab文件

具体格式如下:

Minute Hour Day Month Dayofweek   command
分钟     小时   天     月       天每星期       命令
每个字段代表的含义如下:
     Minute             每个小时的第几分钟执行该任务,0-59
     Hour                每天的第几个小时执行该任务,0-23
     Day                  每月的第几天执行该任务,1-31
     Month             每年的第几个月执行该任务,1-12
     DayOfWeek     每周的第几天执行该任务,0-6,0表示星期日,也可以用英文来表示,sun表示星期天,mon表示星期一

     Command       指定要执行的程序

记住几个特殊符号的含义:

    “*”代表取值范围内的数字,
    “/”代表”每”,
    “-”代表从某个数字到某个数字,
    “,”分开几个离散的数字

举例如下:
5       *       *           *     *     ls             指定每小时的第5分钟执行一次ls命令
30     5       *           *     *     ls             指定每天的 5:30 执行ls命令
30     7       8         *     *     ls              指定每月8号的7:30分执行ls命令
30     5       8         6     *     ls              指定每年的6月8日5:30执行ls命令
30     6       *           *     0     ls            指定每星期日的6:30执行ls命令

30     3     10,20     *     *     ls              每月10号及20号的3:30执行ls命令

25     8-11  *           *     *     ls            每天8-11点的第25分钟执行ls命令

*/15   *       *           *     *     ls            每15分钟执行一次ls命令

30      6     */10    *     *     ls               每个月中,每隔10天6:30执行一次ls命令

50      7       *      *     *     root     run-parts   /etc/cron.daily  

                                                        每天7:50以root 身份执行/etc/cron.daily目录中的所有可执行文件[ 注:run-parts参数表示,执行后面目录中的所有可执行文件。 ]


六.crontab中的输出配置

以上的定时任务执行结果都被输出到对应用户的email中,crond支持将执行结果输出到指定文件中

crontab中经常配置运行脚本输出为:>/dev/null   2>&1,来避免crontab运行中有内容输出。

shell命令的结果可以通过‘> ’的形式来定义输出

/dev/null 代表空设备文件  

> 代表重定向到哪里,例如:echo     "123"     > /home/123.txt 

1 表示stdout标准输出,系统默认值是1,所以">/dev/null"等同于"1>/dev/null"

2 表示stderr标准错误

& 表示等同于的意思,2>&1,表示2的输出重定向等同于1 

那么重定向输出语句的含义:

1>/dev/null 首先表示标准输出重定向到空设备文件,也就是不输出任何信息到终端,不显示任何信息。

2>&1 表示标准错误输出重定向等同于标准输出,因为之前标准输出已经重定向到了空设备文件,所以标准错误输出也重定向到空设备文件。

例1:每天5:30执行ls命令,并把结果输出到/jp/test.log文件中
30     5     *     *     *     ls     >/jp/test.log     2>&1


七.crontab与环境变量
不要假定crond知道所需要的特殊环境,它其实并不知道。所以你要保证在要执行的shelll脚本中提供所有必要的路径和环境变量,除了一些自动设置的全局变量。所以注意如下3点:

1、脚本中涉及文件路径时写全局路径;

2、脚本执行要用到java或其他环境变量时,通过source命令引入环境变量,如:
    cat start_cbp.sh

 #!/bin/sh
 source /etc/profile
 export RUN_CONF=/home/d139/conf/platform/cbp/cbp_jboss.conf
 /usr/local/jboss-4.0.5/bin/run.sh -c mev &


3、当手动执行脚本OK,但是crontab死活不执行时。这时必须大胆怀疑是环境变量惹的祸,并可以尝试在crontab中直接引入环境变量解决问题。如:
0     *     *     *     *     . /etc/profile;/bin/sh     /var/www/java/audit_no_count/bin/restart_audit.sh


八.其他应该注意的问题
1、新创建的crond job,不会马上执行,至少要过2分钟才执行。如果重启crond则马上执行。
2、 每条 JOB 执行完毕之后,系统会自动将输出发送邮件给当前系统用户。日积月累,非常的多,甚至会撑爆整个系统。所以每条 JOB 命令后面进行重定向处理是非常必要的: >/dev/null  2>&1 。前提是对 Job 中的命令需要正常输出已经作了一定的处理, 比如追加到某个特定日志文件。
3、当crontab突然失效时,可以尝试/etc/init.d/crond restart解决问题。或者查看日志看某个job有没有执行报错    tail -f /var/log/cron。
4、千万别乱运行crontab -r。它从Crontab目录(/var/spool/cron)中删除用户的Crontab文件。删除了该用户的所有crontab都没了。
5、在crontab中%是有特殊含义的,表示换行的意思。如果要用的话必须进行转义\%,如经常用的date ‘+%Y%m%d’在crontab里是不会执行的,应该换成date ‘+\%Y\%m\%d’。


附录:

http://blog.csdn.net/hi_kevin/article/details/8983746

http://www.blogjava.net/freeman1984/archive/2010/09/23/332715.html

http://blog.csdn.net/dancen/article/details/24355287