计划任务

为什么要设置计划任务

  我们在系统的管理中,很多时候不是及时的去操作,比如对某一网站数据的备份,备份的过程需要占用大量的系统资源,凌晨三四点的时候系统访问用户最少,系统最空闲。但我们的系统的系统管理员总不能老那个时间爬起来操作吧。

计划任务的命令

  计划命令分一次性计划周期性计划
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

 

posted @ 2018-05-07 09:17  琼兔  阅读(229)  评论(0编辑  收藏  举报