定时任务crond生产实战经验

1.什么是定时任务
crond是linux下用来定期执行某种任务或等待处理某些事件的一个守护进程,与windows下的计划任务类似,当安装完 成操作系统后,默认会安装此服务工具,并且会自动启动crond进程,crond进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。有点类似于闹钟。

特殊需求:crond服务搞不定了,一般工作中写脚本守护程序执行。
Linux下的任务调度分为两类,系统任务调度和用户任务调度。(守护进程:持续运行的程序)

类似的定时任务还有:at,anacron,但这两个生产工作中很少使用,可以忽略

1.1 系统任务调度:

系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。

在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。
/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

2.2 用户任务调度:

用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。

用户可以使用 crontab 工具来定制自己的计划任务。所有用户定义的crontab 文件都被保存在 /var/spool/cron目录中。其文件名与用户名一致。

2.crontab工具的使用
(1)crontab的使用格式

crontab常用的使用格式有如下两种:
crontab [-u user] [file]
crontab [-u user] [-e|-l|-r |-i]

选项含义如下:

  • -u user:用来设定某个用户的crontab服务,例如,“-u ixdba”表示设定ixdba用户的crontab服务,此参数一般有root用户来运行。
  • file:file是命令文件的名字,表示将file做为crontab的任务列表文件并载入crontab。如果在命令行中没有指定这个文件,crontab命令将接受标准输入(键盘)上键入的命令,并将它们载入crontab。
  • -e:编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件。
  • -l:显示某个用户的crontab文件内容,如果不指定用户,则表示显示当前用户的crontab内容。
  • -r:从/var/spool/cron目录中删除某个用户的crontab文件,如果不指定用户,则默认删除当前用户的crontab文件。
  • -i:在删除用户的crontab文件时给确认提示。

PS : crontab [-e|-l|-r |-i]其实就是操作/etc/spool/cron/下的用户文件

(2)crontab文件的含义

wKiom1eYsuLhMftxAAGHfSDjyBc388.jpg-wh_50

用户所建立的crontab文件中,每一行都代表一项任务,每行的每个字段代表一项设置,

它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:
minute hour day month week command
其中:

  • minute: 表示分钟,可以是从0到59之间的任何整数。
  • hour:表示小时,可以是从0到23之间的任何整数。
  • day:表示日期,可以是从1到31之间的任何整数。
  • month:表示月份,可以是从1到12之间的任何整数。
  • week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
  • command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。

在以上各个字段中,还可以使用以下特殊字符:

  • 星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
  • 逗号(,):可以用逗号隔开的值指定一个列表范围,例如,“1,2,5,7,8,9”
  • 中杠(-):可以用整数之间的中杠表示一个整数范围,例如“2-6”表示“2,3,4,5,6”
  • 正斜线(/):可以用正斜线指定时间的间隔频率,例如“0-23/2”表示每两小时执行一次。

同时正斜线可以和星号一起使用,例如*/10,如果用在minute字段,表示每十分钟执行一次。

(3)crontab文件举例

0 */3 * * * /usr/local/apache2/apachectl restart

表示每隔3个小时重启apache服务一次。

30 3 * * 6 /webdata/bin/backup.sh

表示每周六的3点30分执行/webdata/bin/backup.sh脚本的操作。

0 0 1,20 * * fsck /dev/sdb8

表示每个月的1号和20号检查/dev/sdb8磁盘设备。

10 5 */5 * * echo "">/usr/local/apache2/log/access_log

表示每个月的5号、10号、15号、20号、25号、30号的5点10分执行清理apache日志操作。

PS:周和日尽量不要同时用,否则可能达不到想要的效果

例:每周日,上午9点听课

00 09 * * 0 听课

3.crontab实战步骤及注意事项
3.1crontab打包实战

1)进入打包文件或目录的上级目录进行打包

2)定时任务是按小时,打包里的日期也要精确到小时

3)确保命令执行正确,然后写到脚本(复制)

4)定时任务命令或程序最好写到脚本里执行

5)测试脚本正确性(定时任务怎么写,命令行就怎么测试)

6)脚本测试好了,命令行的命令也要复制

7)脚本的路径是要有规范

8)定时打包或处理其他工作,不要再屏幕输出,可以打到日志文件里

3.2工作中调试定时任务的方法

1)增加执行任务频率调试任务

每分钟或者系统时间之后5分钟执行,看看结果对不对

某些任务不能用于生产环境,没有测试机会

代码,配置变更发布流程:

个人开发环境--办公测试环境--IDC机房测试环境--IDC正式环境(分组,灰度发布)

2)调整系统时间调试任务(不能直接用于生产环境)保持5分钟

3)通过脚本日志输出调试定时任务

4)注意一些任务命令带来的问题

tar zcvf echo 123 >a.log

5)注意:环境变量导致定时任务故障(jave)

6)通过crond定时任务服务日志调试定时任务(/var/log/cron)

7)其他方法

3.3crontab注意事项

1)为定时任务规则加必要的注释

2)执行shell脚本任务前加/bin/sh

3)定时任务命令或脚本结尾加>/dev/null 2>&1

4)定时任务命令或程序最好写到脚本里执行

5)在指定用户下执行相关的定时任务

6)生产任务程序不要随意打印输出信息

tar zcvf echo 123 >a.log

7)定时任务执行的脚本要规范路径(/server /scripts)

8)配置定时任务规范操作过程

PS:“/dev/null 2>&1”表示先将标准输出重定向到/dev/null,然后将标准错误重定向到标准输出,由于标准输出已经重定向到了/dev/null因此标准错误也会重定向到/dev/null,避免邮件日志问题

原文地址:https://www.cnblogs.com/yihr/p/12963067.html