难题
---每分钟要执行某个程序检查服务的运行
---每天要对数据进行备份
---每月要对日志进行备份
......
如果你也存在这样的问题,Cron将可以帮助你从繁重的工作中解脱出来。
--------------------------------------------------------------------------------
1、Cron是什么
Cron是计划任务,它保证了某个程序在特定的时间内的准确执行。要安排任何一个cron,就必须有负责这个cron的服务,linux经常用到的服务有atd和crond。
这里注意: 虽然启动了cron服务,但其并不会监听端口,因为无需于外界通信,所以只是会开启一个进程。叫做独立守护进程。但是像httpd这样的独立守护进程,因为要通信,所以其不论是客户端,还是服务器端,都是要打开端口的。
2、Cron之at
单时间点执行某任务,而不循环,依赖于atd服务
<1>配置文件
/etc/at.aloow
/etc/at.deny
配置文件,白名单优先级更高,分为以下几种情况
第一种:白名单和黑名单都存在
只允许白名单中的用户创建计划任务
第二种:只存在白名单
只允许白名单中用户创建计划任务
第三种:只存在黑名单
除黑名单以外的用户都可以创建计划任务
第四种:黑白名单都不存在
除root以外,任何用户不能创建计划任务
<2>执行方式
交互式
输入重定向
at -f FILE
<3>时间表示法
HH:MM 02:00
在今日的HH:MM 进行,若该时刻已过,则明天此时执行任务
HH:MM YYYY-MM-DD 04:00 2016-09-20
规定在某年某月的某一天的特殊时刻进行该项任务
HH:MM[am|pm] [Month] [Date]
04pm March 17
17:20 tomorrow
HH:MM[am|pm] + number [minutes|hours|days|weeks]
now + 5 minutes
04pm + 3 days
在某个时间点再加几个时间后才进行该项任务
注意:系统级任务调度主要完成系统的一些维护操作,用户级任务调度主要完成用户自定义的一些任务,可以将用户级任务调度放到系统级任务调度来完成(不建议这么做),但是反过来却不行。
cron的工作模式
<3>crontab工具的使用
书写格式
常见用法
crontab -e:定义当前用户的计划任务,
保存在/var/spool/cron中
crontab -e -u USER: 修改指定用户的计划任务
crontab -u USER -l:查看指定用户的计划任务,
只有root可以查看
crontab -r:移除所有的计划任务
注意:crontab是拥有suid权限,所以当root修改了普通用户的计划任务之后,用户是可以再次修改的,但是是无法直接修改root的计划任务的。
<4>时间表示法
(1)特定值:
给定时间点有效取值范围内的值
(2)*
给定时间点上有效取值范围内的所有值
表示“每...”
(3)离散取值:
#,#,#
(4)连续取值:-
#-#
(5)在指定时间范围上,定义步长:
/#: #即为步长
<5>配置文件
/etc/cron.deny:定义了所有不允许使用crantab的用户列表
/etc/cron.allow:定义了所有允许使用crantab的用户列表
/var/spool/cron/USER:用户定义的计划任务
/var/spool/mail/USER:用户的邮件
<5>Cron常见错误
环境变量不指定
[root@centos7~]#vim echo.sh
#!/bin/bash
wall everyone..
[root@centos7~]#vim /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin //注意:此处的环境变量
MAILTO=root
...
[root@centos7~]#crontab -e
* * * * * echo.sh //错误,环境变量中不存在
命令书写格式错误
0 * * * * tar -Jcf /backup/etc-`date +%F-%H`.tar.xz /etc/ //格式误,%要转义
# 正确的格式
0 */5 * * * tar -Jcf /backup/etc-`date +\%F-\%H`.tar.xz /etc/
date +%w:显示星期几
时间域不明确
# 第一个域和第三个域是或关系
0 0 1-7 1 1 hostname //表示一月第一个星期或者一月的每周一,执行hosrname
而不是一月的第一个星期的星期一
分钟设置误用
# 每俩小时执行一下/etc/echo.sh
* */2 * * * * etc/echo.sh //错误:这表示每分钟执行一次
# 正确的格式
0 */2 * * * * etc/echo.sh
注意:在crontab中,精度最高只能到分钟级别,如果要使用秒级别的话,可在脚本中使用sleep
也可以
*/1 * * * * sleep 30 date >> /tmp/f1 &> /dev/null
--------------------------------------------------------------------------------
强化练习:
1、每天的2点整和12点整,将/etc目录至/backup目录中,保存的文件名称格式为“etc-yyyy-mm-dd-HH.tar.xz”
0 2,12 * * * tar -Jcf /backup/etc-`date +\%F-\%H`.tar.gz /etc/*
2、每周2, 4, 7备份/var/log/messages文件至/logs目录中,文件名形如“messages-yyyymmdd
0 0 * * 2,4,7 cp -a /var/log/message /log/massage-`date +\%F`
3、每两小时取出当前系统/proc/meminfo文件中以S或M开头的信息追加至/tmp/meminfo.txt文件中
0 */2 * * * cat /proc/meminfo | grep "^[SM]" >> /tmp/meminfo.txt
4、工作日时间,每10分钟执行一次磁盘空间检查,一旦发现任何分区利用率高于80%,就执行wall警报
[root@centos7~/bin]#vim cron.sh
#!/bin/bash
HI=`df | grep "^/dev/sd[a-h]" | tr -s ' ' '%' | cut -d'%' -f 5`
if [ $HI -lt 80 ]; then
wall dangerous
fi
[root@centos7~/bin]#crontab -e
*/10 * * * 1-5 /root/bin/cron.sh