Linux 计划任务 Cron
难题
---每分钟要执行某个程序检查服务的运行
---每天要对数据进行备份
---每月要对日志进行备份
......
如果你也存在这样的问题,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
在某个时间点再加几个时间后才进行该项任务
<4>常见用法
at -l:列出当前系统中等待的作业,相当与atq
at -d:删除指定的作业,相当于atrm
at -f FILE:从指定的文件中读取任务
at -m:任务结束后,发送邮件(例如make、rm等,测试任务的完成状态)
注意: 有标准输出或者错误输出时,才会发送邮件
3、Cron之crontab
多时间点循环执行某任务,依赖于crond服务
<1>环境安装
要实现cron,要安装主程序包cronie、cronie-anacron和crantabs
cronie:主程序包,提供crond进程服务。提供crontab工具。
cronie-anacron:辅助程序包,用于移动设备中那些因为各种原因而无法正常执行的系统任务。服务器中很少用到。生成/etc/anacrontab,定义未正常执行的系统任务。
crontabs:提供系统正常的系统任务。生成/etc/crontab系统级计划任务。
<2>Cron分为用户级别和计划任务和系统级别的计划任务
用户级别的计划任务直接使用crontab定义(用户也可以直接编辑/etc/crontab,只不过修改MAILTO参数)
系统级别的的计划任务在/etc/cron.d中
[root@CentOS7/etc/cron.d]#ls //在此目录下直接编辑文件也可以
0hourly raid-check sysstat
[root@centos7/etc/cron.d]#
[root@centos7/etc/cron.d]#vim 0hourly //0hourly是每小时任务
# Run the hourly jobs
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
01 * * * * root run-parts /etc/cron.hourly //生效的文件在/etc/cron.hourly
[root@centos7/etc/cron.hourly]#ls
0anacron 0yum-hourly.cron //0anacron保证了/etc/anacrontab计划任务的执行
//0yum-hourly.cron同理
[root@centos7/etc/cron.hourly]#vim /etc/anacrontab //真正定义anacrontab的文件,包括
/etc/cron.daily、/etc/cron.monthly
/etc/cron.weekly等文件中
注意:系统级任务调度主要完成系统的一些维护操作,用户级任务调度主要完成用户自定义的一些任务,可以将用户级任务调度放到系统级任务调度来完成(不建议这么做),但是反过来却不行。
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