Crontab定时任务管理
1、检查是否有crontab命令
[root@node1 /root]
$rpm -qa |grep cronie ##crontab使用的软件包是cronie,进程名字是crond
cronie-1.4.11-23.el7.x86_64
cronie-anacron-1.4.11-23.el7.x86_64
2、部分配置文件含义
目录 | 含义 |
---|---|
crontab | 定时任务管理的命令 |
/var/spool/cron/ | 用户的定时任务的配置文件的目录 |
/var/log/cron | 定时任务日志 |
/etc/crontab | 不推荐使用这个,系统定时任务的配置文件 |
/etc/cron.hourly/ | 系统 定时任务,每小时运行 |
/etc/cron.daily/ | 系统定时任务,每天运行 |
/etc/cron.weekly/ | 系统定时任务,每周运行 |
/etc/cron.monthly/ | 系统定时任务,每个月运行 |
3、配置命令的使用
选项 | 含义 | 相当于 |
---|---|---|
crontab -e | edit编辑当前用户的定时任务 | vi /var/spool/cron/root #root当前用户的名字 |
crontab -l | list查看当前用户的定时任务 | cat /var/spool/cron/root #root当前用户的名字 |
- 初次使用定时任务的警告
$crontab -l
no crontab for root #root用户未设置定时任务
$crontab -e
no crontab for root - using an empty one #用户未设置定时任务,创建个新的
4、定时任务的书写格式
* * * * *
第一个代表分钟0-59 #表示整点的时候,未说明分钟的时候,我们要指定的分钟,一般是00
第二个代表小时0-23
第三个代表日期1-31
第四个代表月份1-12
第五个代表周几0-6 #0/7代表周日
#例子
每周周六半夜十二点重启
* 00 * * 6 reboot #代表的意思是每周周六晚上12点的0-59分钟,每分钟都重启
00 00 * * 6 reboot #代表的意思是每周周六晚上12点整重启
5、定时任务的部分特殊符号
符号 | 说明 | 案例 |
---|---|---|
/ | 每隔xxx时间 | 2 * * * * 每2分钟 00 2 * * * 每2个小时 |
- | 表示范围 | 00 08-22 * * * 08-22点的每个小时运行 00 08-22/3 * * * 08-22点的每3小时运行 |
, | 表示独立时间(没规律) | 00 08,11,14,17,20 * * * |
* | 每,全部/所有(没说具体时间) | * 在分钟的位置上表示00-59,每分钟的意思 * 在小时位置上表00-23,每小时的意思. |
#例子
00 07-23/2 * * * reboot #每天在早7到晚11每隔两个小时重启一次
00 20,00-07 * * * reboot #每天晚8点和12点到7点的整点重启
6、经典案例
- 每两分钟同步一次系统时间
*/2 * * * * /sbin/ntpdate ntp1.aliyun.com
- 每天定时备份/etc到/backup下
#使用脚本方式
tar zcf /backup/etc-`date +%F_%w`.tar.gz /etc/ #编辑压缩脚本
00 00 * * * /bin/sh /server/scripts/backup-etc.sh #部署定时任务
7、脚本与变量
- 赋值与取值
- 例子
time=`date +%F_%w`
echo $time
注意:系统会把time的结果写入到内存里,所以每次输出的$变量是固定的,除非重新定义一下
vim crontab.sh
time=`date +%F_%w`
echo $time
当把变量写入脚本中,每次执行脚本输出的$结果都不一样,因为每次执行脚本都会从新定义time变量
- 使用脚本写定时任务
#!/bin/bash
lujing=/backup
time=`date +%F-%H-%M-%S`
tar -zcf $lujing/etc-$time.tar.gz /etc/ #脚本内容
*/1 * * * * /bin/sh /servers/scripts/backup-etc.sh #定时任务语句
8、定时任务失败的推断过程
- 如果没有日志产出,检查crond服务没有运行,rsyslog服务没有运行
- 没有结果,手动运行对应的命令或脚本
- 调试脚本: sh -x 或bash -x 显示脚本执行过程 (有+的表述过程,没有+表述输出,加号越多表示优先级越高)
9、定时任务的注意事项
9.1 增加注释
增加注释用于说明定时任务的作用
9.2 尽量使用脚本
sh -x 或bash -x 显示脚本执行过程 (有+的表示过程,没有+表示输出,加号越多表示优先级越高)
9.3 定时任务的文件,命令和脚本使用绝对路径
`书写定时任务的时候,相关文件要使用绝对路径`
/server/scripts/backup-etc.sh #否则会找不到文件
`在前面运行的命令,也要使用绝对路径或定义环境变量
- 关于命令路径的故障案例
现象: 命令行执行命令或脚本是成功的,交到了定时任务中执行,提示命令找不到
原因: 定时任务运行脚本的时候或命令的时候,只能识别/bin和/usr/bin目录下面的命令.其他的命令无法识别
解决方案:
1、使用命令的绝对路径
2、重新定义PATH或者重新加载PATH环境变量
- export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin #重新定义环境变量(环境变量可用echo $PATH查找)
- source /etc/profile #重新加载环境变量
定时任务识别的命令的路径:PATH linux环境变量,存放命令的位置,linux会在PATH路径中查找,如果有则执行,如果没有提示command not found/ no such file or directory
9.4 定时任务定向到空或追加到文件
现象:
邮件服务开启: 不断收到邮箱 You have new mail in /var/spool/mail/root
邮件服务关闭: 一些邮件的临时目录不断堆积小文件. /var/spool/postfix/maildrop
原因: 定时任务运行命令或脚本的时候,命令或脚本有输出,定时任务就会通过邮件形式发送给root
解决: 定时任务中命令或脚本定向到空或追加到文件
#定向到空
2 * * * * /sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1 #同步时间
#追加到文件
* * * * * echo oldboy /tmp/lidao.txt 2>&1
9.5 定时任务直接书写的时候%有特殊含义
%代表回车
去掉特殊含义需要使用\
如果使用脚本,就没有这个问题了
10、crontab使用案例
10.1 定时备份/etc/目录到/backup以ip地址命名的目录中
- 书写思路
- 取出ip存放变量
- 取出时间存放到变量
- 创建以ip命名目录
- 打包压缩存放到这个ip地址命名的目录中,压缩包加上时间
- 书写定时任务
- 代码
lujing=/backup
ip=`hostname -I | awk '{print $1}'`
time=`date +%F-%H-%M-%S`
mkdir -p $lujing/$ip
tar -zcf $lujing/$ip/etc-$time.tar.gz /etc/
10.2 定时系统巡检(定时输出系统基本信息)写入 到/tmp/sys.log中
#脚本
#!/bin/bash
source /etc/profile
hostname=hostname
ip=`hostname -I |awk '{print $1}'`
#负载信息
average1=`w|awk -F "[ ,]" 'NR==1{print $(NF-4)}'`
average5=`w|awk -F "[ ,]" 'NR==1{print $(NF-2)}'`
average15=`w|awk -F "[ ,]" 'NR==1{print $NF}'`
echo "###########################################"
echo "##################基本信息#################"
echo "主机名:$hostname ip:$ip"
echo "##################负载信息#################"
echo "最近一分钟负载:$average1"
echo "最近五分钟负载:$average5"
echo "最近十五分钟负载:$average15"
echo "###########################################"
echo "##################内存信息#################"
#内存信息
total=`free |awk 'NR==2{print $2}'`
used=`free |awk 'NR==2{print $3}'`
bili=`free |awk 'NR==2{print ($3+$6)/$2*100"%"}'`
echo "总计内存:$total"
echo "使用内存:$used"
echo "内存使用率:$bili"
echo "###########################################"
echo "##################磁盘信息#################"
#磁盘信息
disk_total=`fdisk -l|grep '/dev/sd[a-z][:]'|wc -l`
root_size=`df -h|awk 'NR==6{print $2}'`
root_size_shiyonglv=`df -h|awk 'NR==6{print $5}'`
echo "几块硬盘:$disk_total"
echo "/分区大小:$root_size"
echo "/分区使用率:$root_size_shiyonglv"
echo "###########################################"
echo "##################进程信息#################"
#进程信息
proc_total=`top -bn1|awk 'NR==2{print $2}'`
proc_running=`top -bn1|awk 'NR==2{print $4}'`
proc_stoped=`top -bn1|awk 'NR==2{print $8}'`
proc_zombie=`top -bn1|awk 'NR==2{print $10}'`
echo "进程总数:$proc_total"
echo "运行的进程:$proc_running"
echo "挂起进程:$proc_stoped"
echo "僵尸进程:$proc_zombie"
echo "###########################################"
运行结果
###########################################
##################基本信息#################
主机名:hostname ip:10.0.0.110
##################负载信息#################
最近一分钟负载:0.00
最近五分钟负载:0.01
最近十五分钟负载:0.05
###########################################
##################内存信息#################
总计内存:1863004
使用内存:237380
内存使用率:96.3841%
###########################################
##################磁盘信息#################
几块硬盘:4
/分区大小:27G
/分区使用率:22%
###########################################
##################进程信息#################
进程总数:103
运行的进程:1
挂起进程:0
僵尸进程:0
###########################################