为什么要设置计划任务
我们在系统的管理中,很多时候不是及时的去操作,比如对某一网站数据的备份,备份的过程需要占用大量的系统资源,凌晨三四点的时候系统访问用户最少,系统最空闲。但我们的系统的系统管理员总不能老那个时间爬起来操作吧。
计划任务的命令
计划命令分一次性计划和周期性计划。
at 安排作业在某一时刻执行一次
batch 安排作业在系统负载不重时执行一次
cron 安排周期性运行的作业
一次性计划at和batch
at命令
删除at计划任务
at -d
查看at计划任务
ls /var/spool/at/
batch命令
作用:
安排一个或多个命令在系统负载较轻进运行一次(一般情况下负载较轻指平均负载降到0.8以下)
使用方法同at
周期性计划命令crontab
作用:用于生成cron进程所需要的crontab文件
crontab命令:
crontab[-u user] [-l | -r | -e] [-i]
-l: 列出所有任务;
-e: 编辑任务;
-r: 移除所有任务;
-i:同-r一同使用,以交互式模式移除指定任务
-u user: 仅root可运行,指定用户管理cron任务
crontab命令定义,每个用户都有专用的cron任务文件:/var/spool/cron/USERNAME
注意:运行结果的标准输出和错误以邮件通知给相关用户
centos7 # systemctl status atd crond开机时需启动服务
systemctl enable atd crond 重启还是启动的
centos6 # service crond atd start开机时需启动服务
chkconfig --list atd crond开机启动确保为on状态
/var/spool/cron/ :存放用户的任务计划
/etc/cron.{allow,deny} :控制用户创建任务计划黑白名单,同at原理一样
/var/log/cron :日志文件
/etc/cron.hourly/ :每小时执行的脚本
/etc/cron.daily/ :每天执行的脚本
/etc/cron.weekly/ :每周执行的脚本
/etc/cron.monthly/ :每个月执行脚本
[root@rhel6 ~]# cat /etc/crontab #配置文件
SHELL=/bin/bash #执行任务命令的shell类型
PATH=/sbin:/bin:/usr/sbin:/usr/bin #执行任务的环境变量
MAILTO=root #执行任务的用户
HOME=/ #家目录
# 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
时间通配表示:
- *:对应时间的所有有效取值,每
- ,:离散时间点,和
- -:连续时间点,到
- /:对应取值范围内多久一次,每隔
@reboot :系统启动后执行
@yearly 0 0 1 1 * :每年的1月1号00:00执行一次任务
@annually 0 0 1 1 * :每年的1月1号00:00执行一次任务
@monthly 0 0 1 * * :每月的1号00:00执行一次任务
@weekly 0 0 * * 0 :每周日的00:00执行一次任务
@daily 0 0 * * * :每天的00:00执行一次任务
@hourly 0 * * * * :每小时执行一次任务
对于cron任务来讲,%有特殊用途;如果在命令中要使用%,则需要转义;不过,如果把%放置于单引号中,也可以不用转义
思考:如何在秒级别运行任务?
实现每秒执行
由于crontab最小时间单位为分钟,所以我们需要借用sleep命令使其“睡一会”,来实现秒级别,及不能整除时间单位的计划任务。
sleep命令:
sleep NUMBER [SUFFIX]...
SUFFIX:
s: 秒, 默认
m: 分
h: 小时
d: 天
如:每20秒执行一次
* * * * * for min in 0 1 2; do echo "hi"; sleep 20 ;
done实现每秒执行
#vim test.sh #!/bin/bash while true ;do sleep 1 echo "hello" done #crontab –e * * * * * /root/test.sh >> /data/mail #cat /data/mail
练习
①每12小时备份一次/etc目录至/backups目录中,保存文件名称格式为“/etc-yyyy-mm-dd-hh.tar.gz”
# crontab -e
0 */12 * * * tar -zcf /etc-`date +\%F-\%H`.tar.gz /backups
②每周2,4,7备份/var/log/secure文件至/logs目录中,文件名格式为“secure-yyyymmdd”;
# crontab -e
* * * * 2,4,7 cp -r /var/log/secure /logs/secre-`date +\%F`
③每两个小时取出当前系统/proc/meminfo文件中以S或M开头的行信息追加至/tmp/meminfo.txt文件中;
# crontab -e
0 */2 * * * grep "^[SM].*"/proc/meminfo >> /tmp/meminfo.txt
④四月的第一个星期日早晨1点59分运行a.sh
# crontab -e
59 1 1-7 4 * test `date +\%w` -eq 0 && bash a.sh
⑤工作日时间,每10分钟执行一次磁盘空间检查,一旦发现任何分区利用率高于80%,就执行wall警报
# vim /testdir/disk.sh
#!/bin/bash
a=`df | grep "^/dev/sd" | tr -s ‘ ‘ ‘%‘| cut -d% -f5 | sort -n | tail -1`
if [ $a -gt 80 ];then
wall "The disk will be full"
fi
# chmod +x disk.sh
# crontab -e
*/10 * * * 1-5 /testdir/disk.sh