为什么要设置计划任务
我们在系统的管理中, 很多时候不是及时的去操作, 比如对某一网站数据的备份, 备份的过程需要占用大量的系统资源, 凌晨三四点的时候系统访问用户最少, 系统最空闲. 但我们的系统的系统管理员总不能老那个时间爬起来操作吧.
计划命令分一次性计划和周期性计划.
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 秒执行一次
"font-family: 宋体; font-size: 16px">* * * * * for min in 0 1 2; do ech
练习
每 12 小时备份一次 / etc 目录至 / backups 目录中, 保存文件名称格式为 "/etc-yyyy-mm-dd-hh.tar.gz"
- # crontab -e
- 0 */12 * * * tar -zcf /backups/etc-`date +\%F-\%H`.tar.gz /etc
每周 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
来源: http://www.bubuko.com/infodetail-2685211.html