cron是chronograph的缩写,计时器的意思,crond就是cron daemon,crontab就是cron table
定时任务的使用场景
定时任务日志文件:/var/log/cron
定时任务配置文件:/etc/crontab
定义方式一:编辑文件/etc/crontab
1 | [root@localhost ~]# vim /etc/crontab |
定义方式二:把脚本放到该目录下
1 | /etc/cron.hourly/ # 系统定时任务每个小时运行这个目录里的内容 |
1 | crontab -e # 创建定时任务 |
时间
crond是按照分钟进行计算的,不支持秒
1 | * 表示任意的(分、时、日、月、周)时间都执行 |
用户
1 | 用户为执行该任务的用户,如果不写默认是当前用户,某个用户创建的定时任务都可以在 /var/spool/cron/用户名 中查看 |
命令
1 | 在命令中,每个命令和文件最好使用绝对路径 |
脚本的原因:大多数情况下,我们要相信科学,相信计算机,不是有鬼,就是我们的脚本的问题,这种问题导致crontab不能执行的概率占到 70%以上。因为程序执行到某一步导致crontab终止执行,我就碰到一次在迁移代码的时候将数据库连错了。导致无法访问而死在那里了。
执行环境问题,当我们碰到第一情况下,一般都可以通过手动执行程序将问题扼杀在摇篮里,一般情况下高手是不应该犯第一种错误的。问题是当我们 手动执行成功而crontab不能执行的时候,笔者碰到一次就是执行环境的问题,例如相关路径的设置问题。解决方案:在代码最前面执行 source /home/user/.bash_profile
系统时间不正确。这种问题最好理解,也是比较常见和隐蔽的问题,解决方案:
date -s ********
就是我们的脚本是否有可执行权限。必须保证执行脚本的用户有执行改文件的权限。
crond没有启动:
systemctl start crond
crontab不执行的问题困扰了好长时间,脚本写的都正确,但是就是不执行,最终解决方法如下:
crontab -u root /var/spool/cron/root
这样root用户的crontab就生效了,再重启下服务就好了:systemctl restart 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内即便是写%号,也能被识别出来