1、概述

定时任务:用于执行在Linux中的重复性工作,比如,命令(同步系统时间)、脚本(备份、系统巡检)

2、服务使用流程

3、部署定时任务

3.1 概述

定时任务软件包:cronie,服务名字(进程):crond

[root@linux-87-01 ~]# rpm -qa cronie
[root@linux-87-01 ~]# rpm -ql cronie

相关目录、文件:

目录结构说明
/var/spool/cron/用户的定时任务的配置文件的目录
/usr/bin/crontabcron table,定时任务管理的命令
/var/log/cron定时任务日志
配置文件说明
/etc/crontab不推荐使用这个系统定时任务的配置文件
/etc/crond.daily/系统定时任务,每天运行
/etc/crond.weekly/系统定时任务,每周运行
/etc/crond.hourly/系统定时任务,每小时运行
/etc/crond.monthly/系统定时任务,每月运行
3.2 使用指南
1)配置命令

crontab用于对定时任务的规则进行增删改查

crontab选项说明备注
crontab -eedit编辑当前用户的定时任务vi /var/spool/cron/root #root当前用户名称为root
crontab -llist查看当前用户的定时任务cat /var/spool/cron/root #root当前用户名称为root
2)书写格式

定时任务书写格式-时间

什么时间做什么?
什么时间(分时日月周)什么事情(命令或脚本)
* * * * *命令或脚本

关于时间解释:

分钟:0-59
小时:0-23,24小时格式
日期:1-31
月份:1-12
周:周几,0-6,0或7表示周日

例如:每天早上8:30分,执行ls命令(建议命令用绝对路径)

30 08 * * * /usr/bin/ls
3)时间部分的特殊符号

时间部分的特殊符号有:

时间部分特殊符号说明案例
/每隔XX时间*/2 * * * * 表示每隔2分钟 ,00 */2 * * * 表示每隔2小时
表示范围00 08-22 * * * 8-22点每个小时运行
,表示独立时间(没规律)00 08,11,12 * * *
*每,全部/所有(没说具体时间)*在分钟位置:00-59,每分钟, *在小时位置:00-23,每小时

例如,每天上午7点到晚上11点,每两小时运行CMD命令

00  07-23/2  * * *  CMD
3.3 定时任务案例

案例01:每2分钟同步系统时间

*/2 * * * *  /usr/sbin/ntpdate  aliyun.com

案例02:每天凌晨1点备份/etc/到/backup/下面

#正常的备份如下:
[root@linux-87-01 ~]# mkdir /backup
[root@linux-87-01 ~]# tar czf /backup/etc-`date +%F_%w`.tar.gz /etc/

使用脚本,把脚本文件放在/server/scripts/目录中

#创建脚本
[root@linux-87-01 ~]# vim /server/scripts/backup-etc.sh
tar zcf /backup/etc-`date +%F_%w`.tar.gz /etc/
#执行脚本:
[root@linux-87-01 ~]# sh /server/scripts/backup-etc.sh

使用定时任务执行该脚本

#编写定时任务
[root@linux-87-01 ~]# crontab -e
00 01 * * * /usr/bin/sh  /server/scripts/backup-etc.sh  >/dev/null 2>&1
#查看定时任务
[root@linux-87-01 ~]# crontab -l
00 01 * * * /usr/bin/sh  /server/scripts/backup-etc.sh  >/dev/null 2>&1
[root@linux-87-01 ~]# 

查看定时任务日志:tail /var/log/cron

动态查看:tail -f /var/log/cron 或 tail -F /var/log/cron

案例03:脚本与变量

变量定义与赋值格式:变量名=值

使用”$变量名“,就可以得到变量的值

注意:

1、等号(=)两边不能有空格
2、变量名不能以数字开头
3、变量名可以包含加减号或下划线,除此外,不能有其他特殊符号
4、变量名不能跟已有的命令名相同
5、定义变量名要见名知义,如:name、age等

比如:

#定义变量
[root@linux-87-01 ~]# num=1
#命令中使用变量
[root@linux-87-01 ~]# echo $num
1
[root@linux-87-01 ~]# 

使用变量,重写前面的定时备份脚本:

[root@linux-87-01 ~]# vim /server/scripts/backup-etc.sh
#定义变量
dir=/backup/
date=`date +%F_%w`
tar zcf $dir/etc-$date.tar.gz /etc/
3.4 定时任务注意事项

定时任务的注意事项

1、增加注释。注释说明,方便日后检查,一眼就知道功能是啥
2、尽量使用脚本。使用脚本,避免在定时任务中书写大量命令,写成脚本方便日后修改
3、定时任务的文件、脚本使用绝对路径
4、命令什么时候使用绝对路径?
   执行命令的流程:
    1、命令行输入命令
    2、命令解释器读取命令,查找命令是否存在。在命令的目录查找,PATH环境变量
    3、PATH环境变量存放的是命令的位置(目录)
    4、如果PATH中有,则运行,没有,则报错
5、定时任务中执行的命令或脚本要定向到空或追加到文件,如:>/dev/null 2>&1

定时任务与PATH

命令在/bin/下,可以直接使用。否则,就要使用绝对路径

不想使用绝对路径的方法:

接下来的方案主要面向脚本,如果只是运行命令,推荐使用绝对路径
在脚本开头重新设置PATH:
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
或者
source  /etc/profile

定时任务中执行的命令或脚本要定向到空或追加到文件:

>/dev/null 2>&1   :把前面命令或脚本执行过程中的错误和正确的信息都写入指定的/dev/null
/dev/null 黑洞,所有写入的内容都会被丢失
&>/dev/null:跟>/dev/null 2>&1一样
>>/tmp/test.txt 2>&1 :把前面命令或脚本执行过程中的错误和正确的信息都追加写入指定的/tmp/test.txt文件

如果不定向到空或追加到文件,会怎样?

1、邮件服务(postfix)开启,则会不断收到You have mail in /var/spool/mail/root提示
2、如果邮件服务关闭,一些邮件的临时目录会不断堆积小文件/var/spool/postfix/maildrop/

例如:

[root@linux-87-01 ~]# crontab -e
* * * * *  /usr/bin/echo  haha
3.5 定时任务故障案例

定时任务直接书写的时候%有特殊含义

%表示回车,要想使用%必须使用\转义,写成\%
如果在脚本中,则没有这个问题

例如:

[root@linux-87-01 ~]# crontab -e
* * * * * date+\%F &>>/tmp/date.log
3.6 定时系统巡检

定时输出系统基本信息写入到/tmp/sys.log文件中

定时巡检包含的信息:

1、主机名
2、ip地址
3、负载信息(0 0 0)
4、内存信息(内存多大,用了多少,剩余多少)
5、CPU信息(核心数)
6、磁盘信息(使用了多少、剩余多少)
7、进程信息(一共多少进程,几个运行,几个挂起,几个僵尸)

写入到/tmp/sys.log文件的格式:

############################
主机名:    ip地址:
############################
负载信息
最近1分钟:
最近5分钟:
最近15分钟:
############################
内存信息(单位kb)
总计内存:
内存使用了多少:
内存使用率:
############################
swap信息
swap总大小:
swap使用了:
swap使用率:
############################
磁盘信息
几块硬盘:
根分区大小:
根分区使用率:
############################
进程信息
进程总数:
运行中的进程数:
挂起进程数:
僵尸进程数:
############################

脚本编写:

[root@linux-87-01 ~]# vim /server/scripts/sys_info.sh
#!/bin/bash
# author:root
# desc:系统巡检脚本

#1、系统基本信息
#定义变量
hostname=`hostname`
ipaddr=`hostname -I`
user=`whoami`
#输出
echo "#################################################"
echo "主机名:$hostname    ip地址:$ipaddr"
echo "当前用户:$user"
#2、系统负载信息
cores=`nproc`  #cpu核心数
load01=`uptime | awk -F'[ ,]+' '{print $(NF-2)}'` #最近1分钟负载
load05=`uptime | awk -F'[ ,]+' '{print $(NF-1)}'` #最近5分钟负责
load15=`uptime | awk -F'[ ,]+' '{print $NF}'`     #最近15分钟负责
#输出
echo "#############系统负载信息########################"
echo "cpu核心总数:$cores"
echo "最近1分钟:$load01"
echo "最近5分钟:$load05"
echo "最近15分钟:$load15"
#3、内存、swap信息
mem_total=`free | awk 'NR==2{print $2}'` #总内存
mem_used=`free | awk 'NR==2{print $3}'`  #已使用内存
mem_used_percent=`free | awk 'NR==2{print $3/$2*100"%"}'` #使用率
swap_total=`free | awk 'NR==3{print $2}'`  #swap总大小
swap_used=`free | awk 'NR==3{print $3}'`   #swap已使用
swap_used_percent=`free | awk 'NR==3{print $3/$2*100"%"}'` #使用率
#输出
echo "##########内存、swap信息(单位:kb)##############"
echo "总共内存:$mem_total"
echo "内存使用了多少:$mem_used"
echo "内存使用率:$mem_used_percent"
echo "swap总大小:$swap_total"
echo "swap已使用:$swap_used"
echo "swap使用率:$swap_used_percent"
#4、磁盘信息
disk_total=`lsblk | grep -v 'sr' | grep '^[a-z]' | wc -l`  #硬盘总个数
disk_names=`lsblk | grep -v 'sr' | grep -Eo '^[a-z]+' | xargs` #硬盘名称
fenqu_root_total=`df -h / | awk 'NR==2{print $2}'`  #根分区大小
fenqu_root_used_percent=`df -h / | awk 'NR==2{print $(NF-1)}'`  #根分区使用率
#输出
echo "###################磁盘信息########################"
echo "磁盘个数:$disk_total"
echo "磁盘名称:$disk_names"
echo "根分区大小:$fenqu_root_total"
echo "根分区使用率:$fenqu_root_used_percent"
#5、进程信息
proc_total=`top -bn1 | awk 'NR==2{print $2}'` #进程总数
proc_running=`top -bn1 | awk 'NR==2{print $4}'` #运行中的进程数
proc_zombie=`top -bn1 | awk 'NR==2{print $(NF-1)}'` #僵尸进程数
proc_stopped=`top -bn1 | awk 'NR==2{print $(NF-3)}'`  #挂起进程数
#输出
echo "###################进程信息########################"
echo "进程总数:$proc_total"
echo "运行中的进程数:$proc_running"
echo "挂起的进程数:$proc_stopped"
echo "僵尸进程数:$proc_zombie"
echo "#################################################"

4、邮件服务

Linux系统默认就有邮件服务,命令为:mail

163邮箱开启POP3

获取授权码:假设为:1233544

Linux端配置/etc/mail.rc文件,配置发件人信息

#在该文件最末尾写入配置信息
[root@linux-87-01 ~]# vim /etc/mail.rc
set from=test@163.com  #发件人
set smtp=smtp.163.com  #配置使用163邮箱发生邮件
#如果邮件服务端口被营运商屏蔽了,则
#set smtp=smtps://smtp.163.com:465
#set ssl-verify=ignore
#set nss-config=/etc/pki
set smtp-auth-user=test@163.com  #用户名:邮箱名字、真实的邮箱地址
set smtp-auth-password=1233544    #邮箱授权码
set smtp-auth=login          #认证形式:login

配置好之后,就可以发邮件了:

[root@linux-87-01 ~]# sh /server/scripts/sys_info.sh | mail  -s  "系统巡检信息"  xxxxx@qq.com