Linux中的计划任务Crontab,为什么要在Linux中使用计划任务?工作中会遇到的困难:每分钟都需要执行一个程序检查系统运行状态,每天凌晨需要对过去一天的业务数据进行统计,每个星期需要把日志文件备份,每个月需要把数据库进行备份。有计划任务可以方便的对Linux进行预操作,本课程由慕课网Petter老师讲解。
课程内容
一、CRONTAB是什么
是一个用于设置周期性被执行的任务的工具
被周期性执行的任务称之为Cron Job
周期性执行的任务列表称之为Cron Table
二、CRONTAB实践
1、相关工具
Putty:一个免费的易用的SSH连接工具 下载地址:http://putty.org/
点击下载,找到A.ZIP file containing all the bianries (except PuTTYtel),and also the help files下载,双击putty_zh.exe打开安装,输入IP、端口、连接类型,找到会话打开即可。
2、安装并检查Crontab服务
检查cron服务:
检查crontab工具是否安装或者工具计划的列表:crontab -l
检查crond服务是否启动:service crond status #service 服务名称 status ,status可以去掉,查询services crond 可以使用的命令,服务后面都会加字母d
windows 中cmd输入 services回车(还是点击本地服务)即可查看Windows的服务
安装cron
yum install vixie-cron yum install crontabs
例子:每分钟都打印当前时间到一个日志文件中
crontab -e
按G定位到最下面一行,输入下面
*/1 * * * * date >> /tmp/log.txt
输入Esc
:wq
tail -f /tmp/log.txt #不断的更新显示这个文件后面几行的内容
3、Crontab的基本组成
crontab(配置工具:用于调整定时任务)写入配置文件(文件方式设定的任务)crond(系统服务:每分钟都会从配置文件刷新定时任务)
crontab的配置文件格式
* * * * * [用户名] COMMAND
↓↓ ↓ ↓ ↓
↓↓ ↓ ↓→→→星期0-7(0或7表示星期天)
↓↓ ↓→→→月份1-12
↓↓→→→日起1-31
↓→→→小时0-23
→→→分钟0-59
例子:每晚21:30重启apache(*代表任意,/代表每隔,,代表准点时间,-代表区间)
30 21 * * * service httpd restart
每月1、10、22日的4:45重启apache
45 4 1,10,22 * * service httpd restart
每月1到10号的4:45重启apache
45 4 1-10 * * service httpd restart
每隔2分钟重启apache
*/2 * * * * service httpd restart 或者 1-59/2 * * * * service httpd restart
晚上11点到早上7点之间,每隔一小时重启apache
0 23-7/1 * * * service httpd restart #23-7/1 23点到7点每隔一小时
每天18:00至23:00之间每隔30分钟重启apache
0,30 18-23 * * * service httpd restart 或者 0-59/30 18-23 * * * service httpd restart
0-59/2 * * * * 奇数分钟 0-58/2 * * * * 偶数分钟
注释:
4、Crontab工具的使用
crontab -help
crontab [-u user] file
crontab [-u user] [-e | -l | -r]
crontab [选项]
-e #编辑用户计划
-l #查看用户计划列表,默认显示当前用户的计划列表
-r #删除用户计划
-i #删除用户计划前提示
-s #selinux context
Crontab配置文件
全局(系统、Root)配置文件:/etc/conrab
Root配置文件:只有root用户才会把这些内容载入到计划任务列表中
5、Crontab的日志
tail -f /var/log/cron /var/log/cron保存cron所有的任务执行记录,每天单独保存
6、Crontab常见错误
环境变量
讲的不明确,没记录
命令行双引号中使用%时,未加反斜线\
第三(天)和第五个域(星期)之间执行的是“或”操作
错误例子:四月的第一个星期日早晨1时59分运行a.sh
59 1 1-7 4 0 /root/a.sh
而实际执行是:1-7 和 0 是或的关系,即4月份的1-7号每天都执行,并且当天是星期日的时候也会执行,至少执行了7+3次
正确写法:59 1 1-7 4 * test `date + \%w` -eq 0 && /root/a.sh
#date + \%w 值为1 ;test `date + \%w` -eq 0 判断是否eq(=)0,执行判断的命令是echo $?(判断正确为0,判断失败为1);注意%w未加\是不能执行的;
分钟设置误用
每两小时运行一次:0 */2 * * * date 注意分钟是需要写0的,不然*代表所有分钟
每两分钟运行一次:0-59/2 * * * * 奇数分钟,也是每2分钟执行一次 注意:命令是先满足1-59分钟条件,然后才是每隔2分钟执行
7、CRONTAB补充
如果想没半分钟执行某个命令怎么办?
通过SHELL脚本的sleep命令配合crontab完成这一功能
date && sleep 0.5s && date
data;sleep 0.5s;date # ;号代表不论前面是否成功执行,后面都会执行
例子:通过2个步骤满足上面的问题,即第一步执行原来的每分钟执行一次的命令,第二步执行让第二个命令每分钟执行命令休眠30秒再执行,总体相当于每30秒执行一次。
*/1 * * * * echo "wan"
*/1 * * * * sleep 30s;echo "wan"
以此扩展每分钟执行5次、甚至10次都可以