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)定时任务脚本中的程序命令尽量用全路径(和环境变量的识别有关)