2013年3月27日星期三

【转】定时任务crond实战讲解

4.0linux定时任务crond

4.1linux定时任务crond服务理论详解

4.1.1crond介绍

Crond服务是linux系统中定期执行命令或指定程序的任务

时间间隔单位是分钟、小时、日、月、周组合,适合周期性的日志分析或数据备份等

4.1.2crontab语法及使用方法

  crontab [-u user] file    

crontab [-u user] [-l | -r | -e] [-i] [-s]

-l 列出计划任务

-e 编辑任务计划

-u user 对指定的用户设置计划任务

-r 从crontab目录中删除用户crontab文件

-i 删除用户crontab文件前确认提示

4.1.3crontab格式

格式分为七段,前五段是时间段,第六段是以哪个用户执行crontab(默认是当前用户)第七段为执行的命令

  [root@localhost shell]# crontab -l    

*/1 * * * * /bin/sh /root/shell/aaa.sh > /dev/null 2> /dev/null

时间段含义

含义

取值范围

第一段

分钟

00-59

第二段

小时

00-23

第三段

01-31

第四段

01-12

第五段

周,0代表星期天

0-6

特殊符号的含义

* 星号,时间段全是*表示任意时间,例如00 23 * * * command表示一到23点就执行

- 减号,分隔符表示一个时间范围段例如17-19点,00 17-19 * * * command表示17,18,19点都执行

, 逗号,分割时间段例如20 17,18,20 * * * command 表示17,18,20点30分执行

/n n代表数字,每n单位时间例如 */10 * * * * command表示每10分钟执行一次

4.1.4crond权限文件

/etc/cron_deny 该文件存放不能使用crond服务的用户名

/etc/cron_allow 该文件存放能使用crond服务的用户名

/var/spoole/cron/ 该目录存放用户的crontab文件,以用户名命名

4.1.5crontab依赖的服务

/etc/init.d/crond restart

4.1.6cron实例

  */1 * * * * /bin/echo "I am administratory" >> xu.txt

每一分钟执行一次

  30 9-11 * * * /bin/sh /scriptas.sh>/dev/null 2>&1

9点30和10点30和11点30执行一次

  30 9,11 * * * /bin/sh /scriptas.sh >/dev/null 2>&1

9点30和11点30执行一次

  30 9-17/2 * * * /bin/sh /scriptas.sh >/dev/null 2>&1

9点半到17点半中时间每2个小时执行一次

  30 23 1,15 * * /bin/sh /scriptas.sh >/dev/null 2>&1

每月的1号15号的23点30分执行一次

  30 23 * * 0 /bin/sh /scriptas.sh >/dev/null 2>&1

每星期天的23点30分执行一次

  * 19-6/1 * * * /bin/sh /scriptas.sh >/dev/null 2>&1

提示:这样写是不对的,晚上的19点到早上6点,每1个小时执行一次,前面带了个*,星号表示任意时间,也就是晚上的19点到早上6的,每小时的每一分钟执行一次,可以这样写 0 19-6/1 * * * /bin/sh /scriptas.sh

4.1.7生产环境下使用crontab

例1:每分钟执行一次打印自己的名字到/test/xu文件中

  #print char task by xu for programmer A at 2012-03-04    

*/1 * * * * echo "xu" >> /test/xu >/dev/null 2>&1

例2:每周六、日上午9:00和下午14:00来上班(/test/xu)

  #cron job for ett by xu 2010-03-04    

00 09,14 * * 6,0 /bin/sh /test/script.sh >/dev/null 2>&1

说明:

1、写定时任务时写清注释,是个好习惯,如果:什么人,什么时间,因为谁,做了什么事,都写清楚

2、执行任务时可以省略用户,在执行脚本时,尽量带上/bin/sh否则可能因为脚本没有执行权限而无法执行。

3、如果需要root权限执行的任务可以登录到root用户下设置,如果不需要root权限,可以登录到普通用户下设置。特别注意不同用户的环境变量问题,如果调用了环境变量,最好在脚本中将环境变量重新export下

4、定时任务结尾最好加上>/dev/null 2>&1 如需要打印出日志,可以追加到指定的日志文件中。如果不加>/dev/null 2>&1等命令配置,时间长了,可能会导致系统未开启邮件服务,而导致邮件临时目录/var/spool/clientmqueue文件数猛增,占用大量磁盘inode节点

注意:不是所有任务计划后面都加> /dev/null 2>&1如echo命令就不需要,

*/1 * * * * /bin/echo "I am administratory" >> xu.txt >/dev/null 2&>1 这样写是错误的

如果以执行脚本方式就需要加>/dev/null 2>&1

4.1linux定时任务crond服务实战详解

生产环境中把执行命令放到脚本中,以脚本方式执行

4.1.2案例

1、每隔一分钟,打印"+"号到oldboy.log

  #*/1 * * * * /bin/echo '+' >>oldboy.log

没有指定oldboy.log目录,默认会在执行crontab的用户家目录中.生产环境最好加上绝对路径

注意后面就不要在加>/dev/null 2>&1

2、每隔5分钟将/etc/service文件备份到/tmp每次备份成不同的文件

  [root@localhost shell]# cat tar.sh    

tar zcfp /tmp/service_$(date +%Y%m%d%H%M).tar.gz /etc/services

[root@localhost shell]# echo "#cron job for ett by xu 2010-03-04" >> /var/spool/cron/root

[root@localhost shell]# echo "*/5 * * * * /bin/sh /root/shell/tar.sh > /dev/null 2>&1" >> /var/spool/cron/root

生产环境中把执行命令放到脚本中,以脚本方式执行

3、每天晚上12点,打包站点目录/var/www/html备份到/data目录下(每次备份成不同的文件)

[root@localhost shell]# cat bak.sh

tar zcfp /data/htmlbak_$(date +%Y%m%d%H%M).tar.gz /var/www/html

[root@localhost shell]# echo "#backup site by xu 2010-03-04" >> /var/spool/cron/root

[root@localhost shell]# echo "00 00 * * * /bin/sh /root/shell/bak.sh > /dev/null 2>&1" >> /var/spool/cron/root

生产环境下需要加上注释,一条命令执行完成

4、把当前时间存放到xu.log

01 * * * * /bin/echo $(date +\%Y-\%m-\%d_\%H-\%M).txt >>xu.log

在crontabl中需要用转义符屏蔽%号的作用,情况下最好使用脚本方式然后在使用cron去定时执行,这样减少错误

4.1.3生产环境如何调试crontab定时任务

1先测试脚本是否可用

2加入注释和执行脚本在放入到crontab中

3查看crontab中是否有刚才写入的内容

5、在生产环境中,大多是几个小时或几天执行一次任务,如果是每1周执行,为防止出错,我们先把计划任务的时间调成每1分钟执行一次,如果正常执行了,说明没问题,在把时间该回1个月执行。

6、在脚本中加入日志输出,然后把输出内容输出到一个日志中,可以观察是否正确执行了脚本,比如 * * * * 0 /bin/sh /root/shell/script.sh >/root/bak.log

摘自:http://www.opsers.org/others/2580.html

没有评论: