crond计划任务
一 定时任务介绍
1、什么是定时任务?
设定某个日期或时间周期性执行指令。比如设定一个闹铃,叫你每天早上7点钟起床等,这就是一个定时任务。
2、什么是Crond?
Crond是Linux系统中用来定期执行命令或脚本的一种服务软件,一般情况下,我们安装完CentOS操作系统之后,默认便会启动Crond任务调度服务。
Crond服务会定期(默认每分钟检查一次)检查系统中是否有要执行的任务工作,如果有,便会根据其预先设定的定时任务规则自动执行该定时任务工作,这个Crond定时任务服务就相当于我们平时早起使用的闹钟一样。
3、crond日志文件
/var/log/cron
4.、为什么要使用定时任务?
定期备份数据,定期执行脚本程序
我们举个例子说明:例如,我们的数据库或者代码程序需要每天晚上0点做一次备份,这样每天夜里都需要执行的周期性工作,如果要让人操作的话,就得每天半夜爬起来,然后登录系统执行任务,执行完接着睡觉。另外,执行任务的过程也可能持续几个小时,这样一来,一个晚上我们就都不用睡觉了,这样显然是不行的。那么有什么办法来解决这个周期性的执行任务需求呢?
这就是Linux系统的定时任务Crond,这相当于我们平时生活中的闹钟功能,每天晚上提前设置定时,早晨按时叫醒你。
5、 定时任务主要分为以下两种使用情况。
(1)系统级别的定时任务: 临时文件清理例/tmp和/var/tmp等、系统信息采集、日志文件切割
(2)用户级别的定时任务: 定时向互联网同步时间、定时备份系统配置文件、定时备份数据库的数据
二 定时任务管理
2.1 系统级计划任务
# 定义方式一:编辑文件/etc/crontab
[root@localhost ~]# vim /etc/crontab
[root@localhost ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
分钟
小时
日
月
周
定义方式二:把脚本放到该目录下
/etc/cron.hourly/ # 系统定时任务每个小时运行这个目录里的内容
/etc/cron.daily/ # 系统定时任务每天运行这个目录里的内容
/etc/cron.weekly/ # 系统定时任务每周运行这个目录里的内容
/etc/cron.monthly/ # 系统定时任务每月运行这个目录里的内容
2.2 用户级计划任务
[root@localhost ~]# crontab -e # 创建计划任务
* * * * * /bin/ls
[root@localhost ~]# crontab -l # 查看计划任务
* * * * * /bin/ls
[root@localhost ~]# ls /var/spool/cron/
root
[root@localhost ~]# cat /var/spool/cron/root # 都是写在这里呢
* * * * * /bin/ls
[root@localhost ~]# tail /var/log/cron # 查看日志
[root@localhost ~]# crontab -u egon -e
[root@localhost ~]# tail -f /var/spool/mail/root # 查看邮件
[root@localhost ~]# tail -f /var/log/cron # 查看计划任务执行情况
# /etc/cron.deny 是定时任务的黑名单,使用root将需要拒绝的用户加入/etc/cron.deny
[root@localhost ~]# echo "egon" >> /etc/cron.deny
[root@localhost ~]# su - egon # 登陆该普通用户,无法编写定时任务
上一次登录:四 8月 13 19:44:10 CST 2020pts/1 上
[egon@localhost ~]$ crontab -e
You (egon) are not allowed to use this program (crontab)
See crontab(1) for more information
2.3 计划任务语法格式
crond是按照分钟进行计算的,不支持秒
* 表示任意的(分、时、日、月、周)时间都执行
- 表示一个时间范围段, 如5-7点
, 表示分隔时段, 如6,0,4表示周六、日、四
/1 表示每隔n单位时间, 如*/10 每10分钟
了解定时任务crontab的编写规范。
00 21 * * * #每天晚上21:00执行
45 4 1,10,22 * * #每月1、10、22日的4:45执行
45 4 1-10 * * #每月1到10日的4:45执行
3,15 8-11 */2 * * #每隔两天的上午8点到11点的第3和第15分钟执行
0 23-7/2 * * * #晚上11点到早上7点之间,每隔两小时执行
15 21 * * 1-5 #周一到周五每天晚上21:15执行
命令最好用绝对路径
[root@localhost test]# crontab -e
[root@localhost test]# crontab -l
* * * * * ntpdate ntp.aliyun.com
您在 /var/spool/mail/root 中有邮件
[root@localhost test]# cat /var/spool/mail/root | tail -3
/bin/sh: ntpdate: 未找到命令
[root@localhost ~]# crontab -l # 重新修改
* * * * * /usr/sbin/ntpdate ntp.aliyun.com
注意:每执行一次计划任务就会记录日志到/var/log/cron,会导致文件过大,可以关闭邮件服务
[root@localhost test]# systemctl stop postfix.service
邮件服务停止之后,在/var/spool/postfix/maildrop/目录下,会生成很多的小文件,定时任务执行一次,目录就会生成一个文件,日积月累的话,磁盘的inode会被沾满,导致磁盘故障,重新编写定时任务
[root@localhost ~]# crontab -l
* * * * * /usr/sbin/ntpdate ntp.aliyun.com &>/dev/null
总结:
1、查看cron服务是否起作用:
如果我们要查看定时任务是否准时调用了可以/var/log/cron中的运行信息
cat /var/log/cron
也可以用tail -f /var/spool/mail/用户名,来查看普通用户的计划任务执行情况
此处需要记住两点:
(1):cron 守护进程每分钟都检查 /etc/crontab 文件、etc/cron.d/ 目录、以及 /var/spool/cron 目录中的改变。如果发现了改变,它们就会被载入内存。这样,当某个 crontab 文件改变后就不必重新启动守护进程了。**
(2):crontab的用户手册中推荐每一个命令使用绝对路径,例如调用rm命令时写作:/bin/rm,这是为了防止由于每一个用户的PATH环境变量不同而导致命令无法找到的错误。
2、编写定时任务时,先在命令行上面执行一次,查看是否可以执行成功。
3、把定时任务执行的结果定向到空,如果不定向到空的话,邮件服务开启时,系统会一直发送邮件信息,邮件服务关闭时,系统会大量生成小文件。
示例3:每分钟把系统时间追加到一个文件中,以2019-06-15_13:54:10格式
[root@localhost ~]# crontab -l
* * * * * /usr/bin/date +\%F_\%T >> /root/time.txt
务必注意加上转义符号,因为在定时任务中,有些特殊符号会被误解,不转义是无法执行的。
示例4:每天凌晨3点做一次备份?将/etc/目录进行打包,备份到/backup下面,且只能保留最近三天的数据。
[root@localhost ~]# cat /root/bak.sh
#!bin/bash
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin # 防止下述命令出问题
mkdir /backup
cd /
tar -czf backup/$(hostname)_$(date +\%F_\%T)_etc.tar.gz /etc
find backup -type f -name "*.tar.gz" -mtime +3 |xargs rm -rf
[root@localhost ~]# crontab -l
* * * * * /bin/bash /root/bak.sh &>/dev/null
三 crontab不执行的问题
第一,脚本的原因:大多数情况下,我们要相信科学,相信计算机,不是有鬼,就是我们的脚本的问题,这种问题导致crontab不能执行的概率占到 70%以上。因为程序执行到某一步导致crontab终止执行,我就碰到一次在迁移代码的时候将数据库连错了。导致无法访问而死在那里了。
第二,执行环境问题,当我们碰到第一情况下,一般都可以通过手动执行程序将问题扼杀在摇篮里,一般情况下高手是不应该犯第一种错误的。问题是当我们 手动执行成功而crontab不能执行的时候,笔者碰到一次就是执行环境的问题,例如相关路径的设置问题。解决方案:在代码最前面执行 source /home/user/.bash_profile
第三,系统时间不正确。这种问题最好理解,也是比较常见和隐蔽的问题,解决方案:date -s ********
第四,就是我们的脚本是否有可执行权限。必须保证执行脚本的用户有执行改文件的权限。
第五,crontab 守护进程死掉了。这种情况是极少发生的,但也不排除,当我们实在是找不到其他原因的时候可以用。解决方案:重启该进程。
第六,crontab不执行的问题困扰了好长时间,脚本写的都正确,但是就是不执行,最终解决方法如下:
crontab -u root /var/spool/cron/root
这样root用户的crontab就生效了
[root@localhost ~]# systemctl restart crond
重启下服务就好了
第七,crond没有启动
第八,脚本编码问题,脚本在window下编写,传到linux下后报“锘?!/bin/bash”,用vi编辑器新建新shell脚本,输入内容后保存。
第九
* * * * * tar czf /tmp/`date '+%Y'` /etc 该计划任务中命令的执行流程是crond->tar命令,而crond在执行tar命令时,无法识别通配符%的意思(shell能识别),所以该命令无法正常执行
改正结果:* * * * * tar czf /tmp/`date '+\%Y'` /etc
通常都会把要执行的操作放到文件中,然后/bin/bash a.sh去执行,* * * * * /bin/bash a.sh ,这样的执行流程就变成了crond->bash shell->a.sh,这样a.sh内即便是写%号,也能被识别出来
五 定时发邮件
https://www.cnblogs.com/linhaifeng/p/6602149.html#_label7
六 定时任务编写思路
1.手动执行命令,然后保留执行成功的结果。
2.编写脚本
脚本需要统一路径/scripts 脚本内容复制执行成功的命令(减少每个环节出错几率)
3.执行脚本
使用bash命令执行, 防止脚本没有增加执行权限(/usr/bin/bash /bin/bash) 执行脚本成功后,复制该执行的命令,以便写入cron
4.编写定时任务
加上必要的注释信息, 人、时间、任务
设定定时任务执行的周期
粘贴执行脚本的命令(不要手敲)
5.调试定时任务
增加任务频率测试
检查环境变量问题(最好在脚本中重新定义环境变量PATH)
检查crond服务日志
七 总结:9句箴言
1.定时任务规则之前加注释
2.使用脚本执行定时任务(只有一条简单命令的可以直接使用命令执行)
3.运行脚本一定要用绝对路径执行,统一脚本位置。
4.定时任务中date命令的百分号需转义才能使用。
5.命令或脚本结果(正确及错误)定向到空(>/dev/null 2>&1)或追加到文件中 >>/tmp/oldboy.txt 2>&1
6.避免不必要的程序及命令输出,如打包命令,tar -v的显示过程的选项。
7.打包压缩使用相对路径(切到目标目录的上一级打包目标)
8.定时任务脚本中的程序文件 ,尽量用绝对路径,用户的定时任务中的文件默认存放在当前用户的家目录
9.系统与命令位置有关的环境变量问题,建议脚本中重新定义环境变量PATH。