Linux系统定时任务Crond

Crond是什么

Crond是Linux系统中用来定期执行命令或指定程序任务的一种服务或软件。

特殊需求:(秒级别)crond服务就无法搞定,一般工作中邪脚本守护进程执行(一般用不上)

为什么要使用crond定时任务

Linux系统的定时任务crond,相当于我们平时生活中得闹钟功能。可以满足周期性执行任务的需求。

Linux系统的定时任务

Linux系统中定时任务调度的工作可以分为以下两种情况

1.Linux系统自身定期执行的任务工作:系统周期性执行的任务工作,如轮询系统日志,备份系统数据,清理系统缓存等


2.用户执行的任务工作:例如每隔5分钟和互联网上时间服务器进行时间同步。一般这些工作需要用户自行设置。

[root@student ~]# crontab -l
####time sync by xuliangwei 2015-07-30
*/5 * * * * /usr/sbin/ntpdate time.windows.com >/dev/null 2>&1

定时任务crond使用说明

[root@student ~]# crontab --help
crontab: invalid option -- '-'
crontab: usage error: unrecognized option
usage:  crontab [-u user] file
        crontab [-u user] [ -e | -l | -r ]
                (default operation is replace, per 1003.2)
        -e      (edit user's crontab)
        -l      (list user's crontab)
        -r      (delete user's crontab)
        -i      (prompt before deleting user's crontab)
        -s      (selinux context)

指令选项说明表

参数含义指定示例

-e编辑crontab文件内容crontab -e
-l查看crontab文件内容crontab -l
-i删除crontab文件内容,删除前会提示确认Crontab -ri
-r删除crontab文件内容crontab -r
-u指定使用的用户执行任务crontab -u xuliangwei -l

提示:crontab {-l -e}实际上就是在操作/var/spool/cron/当前用户这样的文件

crontab语法格式中时间段含义表

含义取值范围

第一段代表分钟00-59
第二段代表小时00-23
第三段代表日期01-31
第四段代表月份01-12
第五段代表星期0-7(0和7都代表星期天)

crontab语法格式特殊符号含义表

特殊符号含义

**号表示任意时间都,就是”每”的意思,举例:如 00 01 * * * cmd 表示每月每周每日的凌晨1点执行cmd命令

-减号,表示分隔符,表示一个时间范围段,如17-19点,每小时00分执行任务 00 17-19 * * * cmd 就是17,18,19整点分别执行

,逗号,表示分隔符时间段的意思。30 20,21,22 * * * cmd 表示每天20,21,22点得半点执行cmd。 

 /nn代表数字,即”每隔n单位时间”例如:每10分钟执行一次任务 */10 * * * * cmd   其中*/10  也可以写成  0-59/10


使用者权限及定时任务文件

文件说明

/etc/crontabCrontab配置文件

/etc/cron.deny该文件中所列用户不允许使用crontab命令。

/var/spool/cron所有用户crontab配置文件默认都存放在此目录,文件以用户名命名。

生产中书写定时任务的要领

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

[root@student ~]# crontab -l
####time sync by xuliangwei 2015-07-30
*/5 * * * * /usr/sbin/ntpdate time.windows.com >/dev/null 2>&1

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

[root@student ~]# crontab -l
####backup www to /backup xuliangwei 2015-07-30
00 01 * * * /bin/sh /server/scripts/www_backup.sh >/dev/null 2>&1

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

[root@student ~]# crontab -l
####backup www to /backup xuliangwei 2015-07-30
00 01 * * * /bin/sh /server/scripts/www_backup.sh >/dev/null 2>&1

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

[root@student ~]# crontab -l
####backup www to /backup xuliangwei 2015-07-30
00 01 * * * /bin/sh /server/scripts/www_backup.sh >/dev/null 2>&1

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

[root@student ~]# crontab -l
####backup www to /backup xuliangwei 2015-07-30
00 01 * * * /bin/sh /server/scripts/www_backup.sh >/dev/null 2>&1

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

这里要特别注意不同用户的环境变量问题,如果是调用了系统环境变量/etc/profile,最好在程序脚本中将用到得环境变量重新export下。

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

在调试好脚本程序后,应尽量把DEBUG及命令的输出信息屏蔽掉,如果确实需要输出日志,可定向到日志文件里,避免产生系统垃圾。

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

1)配置定时任务规范操作过程,防止出错。

2)首先要在命令操作成功,然后复制成功的命令到脚本里,在各个细小环节减少出错的机会

3)然后测试脚本,测试成功后,复制脚本的规范路径到定时任务配置里,不要手敲。

生产中如何调试定时任务

规范的公司开发和运维人员操作流程:

个人的开发配置环境→办公室测试环境→idc机房测试环境→idc机房正式环境。

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

在调试时,把任务执行频率调快一点,看能不能正常执行,如果正常,那就没问题,再改成需要的任务的执行时间。

注意:有些任务时,不允许频繁执行,例如:定时往数据库里插入数据,这样的任务要在测试机上测试好,然后正式线上出问题的机会就少了。

调整系统时间调试任务

用正确的执行任务的时间,设置完成后,可以修改下系统当前时间,改成任务执行时间的前几分钟来测试(或者重启定时任务服务)

注意:(不能直接用于生产环境),保证5分钟

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

在脚本中加入日志输出,然后把输出打到指定的日志中,然后观察日志内容的结果,看是否正确执行。

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

* * * * * echo “xuliangwei” >>/tmp/xlw.log >/dev/null 2>&1 这里隐藏的无法正确执行的任务配置,原因是前面多了>>,或者去掉后面的 >/dev/null 2>&1

注意环境变量导致的定时任务故障

例如:在调试java程序任务的时候,注意环境变量,把环境变量的定义加到脚本里。

通过crond定时任务服务日志调试定时任务

[root@student ~]# tail -f /var/log/cron
Jul 31 12:15:01 student CROND[7530]: (root) CMD (/usr/sbin/ntpdate time.windows.com >/dev/null 2>&1)
Jul 31 12:15:29 student crontab[7527]: (root) REPLACE (root)

生产中定时任务10简言

系统环境变量问题

脚本权限问题加 /bin/sh

实践变量问题用反斜线\%转义,最好使用脚本。

>/dev/null 2>&1问题

定时任务规则之前加注释

使用脚本程序替代命令行定时任务

避免不必要的程序及命令输出

1)切到目标目录的上一级打包目标

2)定时任务脚本中的程序命令尽量用全路径(和环境变量的识别有关)