一、定时任务
1、概述
定时任务:用于执行在Linux中的重复性工作.eg:命令(同步系统时间),脚本(备份,系统巡检)
定时任务:类似于闹钟.
2、服务使用流程
服务使用流程 | 说明 |
---|---|
部署 | 安装这个服务软件 |
配置 | 如何使用这个服务通过配置文件,通过命令。 |
优化或注意事项 | 安全问题 |
排障 | 难点: 1、通过错误提示解决 2、学会看日志 3、让服务错误提示或者输出更加详细的错误提示(通过重定向) |
其他 | 1、做好备份 2、做好监控 3、做好日志收集 4、统一认证 |
3、部署定时任务
定时任务软件包名字,服务名字(进程)
sh
[root@nanjing ~]# systemctl status crond
Active: active (running) since 二 2024-02-06 21:27:53 CST; 5 days ago
[root@nanjing ~]# rpm -qa cronie
cronie-1.4.11-23.el7.x86_64
目录结构 | 说明 |
---|---|
/var/spool/cron/ | 用户的定时任务的配置文件的目录 |
/var/log/cron | 定时任务日志 |
检查是否运行

4、完全使用指南
4.1、配置的命令
crontab用于对定时任务的规则进行增删改查.
crontab选项 | 说明 | |
---|---|---|
crontab -e | edit编辑当前用户的定时任务 | vi /var/spool/cron/root #root当前用户的名字 |
crontab -l | list查看当前用户的定时任务 | cat /var/spool/cron/root #root当前用户的名字 |
sh
[root@nanjing ~]# crontab -e
no crontab for root - using an empty one
crontab: installing new crontab
[root@nanjing ~]# crontab -l
#it is test
4.2、定时任务书写格式-时间

sh
每天早上8:30分 去学校(go to school)
#1.test01
30 08 * * * go to school
晚上12点上床睡觉(go to bed/sleep)
#2.test02
* 00 * * * go to bed #每天的半夜12点00-59 每分钟运行.
00 00 * * * go to bed #每天运行
问题:
表示整点的时候,未说明分钟的时候,我们要指定的分钟,一般是00.
4.3、定时任务时间部分的特殊符号
时间部分特殊符号 | 说明 | 案例 |
---|---|---|
/ | 每隔XX时间 | */2 * * * * 每两分钟 00 */2 * * * 每两小时 |
- | 表示范围 | 00 08-22 * * * 08-22点每小时运行 00 08-22/3 * * * 08-22点每三小时运行 |
, | 表示独立时间(没规律) | 00 08.12.18 * * * |
* | 每,全部/所有(没说具体时间) | *在分钟的位置上表示00-59,每分钟 *在小时位置上00-23,每小时的意思 |
5、定时任务案例
- 同步时间
- 进行备份
- 日常循环操作
- 巡检+发送邮件
时间+命令格式
5.1、每两分钟同步一下系统时间
使用了什么命令? ntpdate ntp1.aliyun.com
书写定时任务配置文件:
sh
*/2 * * * * /sbin/ntpdate ntp1.aliyun.com
尝试修改时间
sh
date -s '20111213'
日志:这个定时任务是否运行
定时任务日志只能提示是否运行了,但是无法告诉我们是否运行成功.

遇到,小bug:同步时间时报错the NTP socket is in use, exiting

思路来源:线上生产环境同步时间服务器时报错the NTP socket is in use, exiting
原因分析:报错的原因是系统ntpd服务器正在运行中,通过以下命令查看ntpd是否在运行。
sh
ps -ef | grep ntpd
解决办法:由于ntpd在运行,要解决此问题只要关闭ntpd即可解决
sh
systemctl stop ntpd
5.2、每天定时备份/etc/到/backup/下面
备份时间:业务低谷期。 比如凌晨1点备份
- 命令:tar命令
- 脚本:命令大礼包.sh结尾 .bash结尾
- 定时任务配置:(每分钟运行)
- 调试完成改为要求的时间
sh
#1、创建目录
mkdir -p /server/scripts
#2、脚本
cat backup-etc.sh
tar zcf /backup/etc-`date +%F_%w`.tar.gz /etc/
#3、测试执行
sh backup-etc.sh
#4、定时任务
crontab -e
00 01 * * * /usr/bin/sh /server/scripts/backup-etc.sh
5.3、脚本与变量(脚本深入)
变量与命令(命令中如何使用变量)
sh
创建以时间命名的文件oldboy-时间.txt
time=`date +%F_%w`
touch oldboy-$time.txt
在脚本中使用变量
sh
[root@nanjing ~]# cat /server/scripts/backup-etc-var.sh
#!/bin/bash
##定义变量
time=`date +%F_%w_%H`
#引用变量-备份
tar zcf /backup/etc-${time}.tar.gz /etc/

设置时间秒,但是执行没有变化原因。
瞬时变量并且直接记录
二、定时任务注意事项(箴言)
2.1、增加注释
书写定时任务的时候,尽量添加上一个注释.
用于说明这条定时任务作用.
2.2、尽量使用脚本
定时任务未来避免一些故障,推荐使用脚本.
调试脚本的方法:
sh -x 或bash -x ,显示脚本执行过程.
- 有+开头的表示脚本背后执行的过程.
- 如果开头没有+,表示输出.
sh[root@nanjing scripts]# sh -x backup-etc.sh ++ date +%F_%w + tar zcf /backup/etc-2024-02-12_1.tar.gz /etc/ tar: 从成员名中删除开头的"/"
2.3、定时任务的文件,脚本使用绝对路径
书写定时任务的时候,相关文件要使用绝对路径.
sh
/server/scripts/backup-etc.sh
在定时任务运行命令或脚本的时候,只能识别到/bin或/usr/bin目录下面的命令
只要不在这些目录下面的命令,就要使用绝对路径或者重新定义下PATH环境变量(source /etc/profile)
PATH是临时的环境变量,只要断开连接重连就可以恢复
sh
[root@nanjing ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/python-3.8.6/bin:/root/bin
[root@nanjing ~]# PATH='1'
[root@nanjing ~]# ls
-bash: ls: 未找到命令
[root@nanjing ~]# mv
-bash: mv: 未找到命令
[root@nanjing ~]#
连接断开
连接主机...
连接主机成功
[root@nanjing ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/python-3.8.6/bin:/root/bin
2.4、定时任务中执行的命令或脚本定向到空或追加到文件
sh
#定向到空
#1、同步时间 by lidao996 at 20221111
*/2 * * * * /sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1
#2、追加到文件
* * * * * echo shishuwu >>/tmp/test.txt 2>&1
三、定时任务故障案例
3.1、定时任务直接书写的时候%有特殊含义
- %回车
- 去掉特殊含义需要使用 \
如果使用脚本,就没有这个问题了
3.2、定时任务关于命令路径的故障
在定时任务运行命令或脚本的时候,只能识别到/bin或/usr/bin目录下面的命令
只要不在这些目录下面的命令,就要使用绝对路径或者重新定义下PATH环境变量.
故障案例:
现象:命令行执行命令或脚本是成功的,交到了定时任务中执行,提示命令找不到.
原因:定时任务运行脚本的时候或命令的时候,只能识别/bin和/usr/bin目录下面的命令,其他的命令无法识别
解决方案:
- A:简单粗暴,遇到这种命令,直接写绝对路径
- B:治本,在脚本开头重新定义下PATH环境变量或重新加载下PATH环境变量
使用方案A
sh
[root@nanjing sh]# cat nousePATH.sh
#!/bin/bash
/usr/sbin/ip a s eth0
使用方案B
1、重新加载PATH变量(常用)
sh
[root@nanjing sh]# cat usePATH.sh
#!/bin/bash
source /etc/profile
ip a s eth0
2、声明PATH变量
sh
[root@nanjing sh]# cat usePATH.sh
#!/bin/bash
export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/usr/local/python-3.8.6/bin:/root/bin
ip a s eth0
报错截图

3.3、定时任务没有定向到空或追加到文件故障案例
Linux注明的黑洞和白洞:
黑洞
/dev/null
放在里面的文件默认抛弃白洞
/dev/zero
不断吐出字符
sh[root@nanjing ~]# ll /dev/null /dev/zero crw-rw-rw- 1 root root 1, 3 2月 12 20:27 /dev/null crw-rw-rw- 1 root root 1, 5 2月 12 20:27 /dev/zero
现象: 邮件服务开启: 不断收到邮箱 You have new mail in /var/spool/mail/root
邮件服务关闭: 一些邮件的临时目录不断堆积小文件. /var/spool/postfix/maildrop
原因:
定时任务运行命令或脚本的时候,命令或脚本有输出,定时任务就会通过邮件形式发送给root.
解决:
定时任务中命令或脚本定向到空或追加到文件.
通过我的观察,云服务器厂商的镜像默认关闭postfix邮件服务
四、使用案例
4.1、定时备份/etc/目录到/backup以ip地址命名的目录中
sh
#获取服务器IP
#hostname -I 输出后面有空格
[root@nanjing ~]# hostname -I| awk '{print$1}'
10.0.0.2
#获取服务器时间
#[root@nanjing sh]# date +%F_%w
2024-02-12_1
脚本如下:
sh
[root@nanjing ~]# cat /sh/backup-ip.sh
#!/bin/bash
#source /etc/profile
dir=/backup/
ip=`hostname -I | awk '{print $1}'`
time=`date +%F_%w`
backup_dir=${dir}${ip}
mkdir -p ${backup_dir}
tar zcf ${backup_dir}/etc-${time}.tar.gz /etc/
定时任务
sh
00 01 * * * /usr/bin/sh /sh/backup-ip.sh >>/tmp/ip.log 2>&1

因为空格造成的bug(反复排查到最不可能的ip表达式)
错误发生点:
因为第一个表达式前面有空格,导致创建文件有问题
sh[root@nanjing ~]# ip a s eth0 | awk -F'inet|/' 'NR==3{print$2}' 10.0.0.2 #下面是正确写法 [root@nanjing ~]# ip a s eth0 | awk -F'inet|/' 'NR==3{print$2}' | awk '{print$1}' 10.0.0.2 [root@nanjing ~]# ip a s eth0 | awk -F'inet |/' 'NR==3{print$2}' 10.0.0.2 [root@nanjing ~]# hostname -I| awk '{print$1}' 10.0.0.2
- 查缺补漏1:
这个命令为什么没有输出?------》引申出对-F的用法不精确
这表示
awk
应该将 "inet"、"/" 和空格都视为分隔符。但是,如果您的输入中 "inet" 和 "/" 之间有空格,那么awk
将会将空格作为分隔符,而不会识别 "inet" 和 "/" 作为单独的单词。
sh[root@nanjing ~]# echo "inet 192.168.1.1/24" | awk -F'[inet/ ]' '{print $3}' [root@nanjing ~]#
正确写法:以
inet
和/为分隔号。
sh[root@nanjing ~]# echo "inet 192.168.1.1/24" | awk -F'inet |/' '{print $2}' 192.168.1.1
- 查缺补漏2:
脚本中变量表达方式
ship=`ip a` echo ${ip}
4.2、定时系统巡检(定时输出系统基本信息)写入到/tmp/sys.tog中
通过手动或自动方式,获取所有主机的基本信息.
未来这个操作可以通过监控实现.
sh
#!/bin/bash
source /etc/profile
#变量
hostname=`hostname`
ip=`hostname -I`
load1min=`uptime | awk -F'[ ,]+' '{print $NF}'`
load5min=`uptime | awk -F'[ ,]+' '{print $(NF-1)}'`
load15min=`uptime | awk -F'[ ,]+' '{print $(NF-2)}'`
free=`free | awk 'NR==2{print$2}'`
usefree=`free | awk 'NR==2{print($3+$6)}'`
use=`free | awk 'NR==2{print($3+$6)/$2*100"%"}'`
swap=`free | awk 'NR==3{print$2}'`
useswap=`free | awk 'NR==3{print$3}'`
num=`ls /dev/ | grep vd[a-z]$ | wc -l`
useblk=`df -h | awk '$NF=="/"' | awk '{print $(NF-1)}'`
allblk=`df -h | awk '$NF=="/"' | awk '{print $2}'`
process_total=`top -bn1| awk 'NR==2{print $2}'`
process_run=`top -bn1| awk 'NR==2{print $4}'`
process_stop=`top -bn1| awk 'NR==2{print $8}'`
process_zombie=`top -bn1| awk 'NR==2{print $10}'`
#输出
echo "#################################"
echo "主机名: ${hostname} "
echo "ip地址: ${ip}"
echo "#################################"
echo "负载信息"
echo "最近1分钟: ${load1min}"
echo "最近5分钟: ${load5min}"
echo "最近15分钟: ${load15min}"
echo "#################################"
echo "内存信息(单位kb)"
echo "总计内存: ${free}"
echo "内存使用了多少:${usefree}"
echo "内存使用率: ${use}"
echo "#################################"
echo "swap信息"
echo "swap总大小: ${swap}"
echo "swap使用大小: ${useswap}"
echo "#################################"
echo "磁盘信息"
echo "几块硬盘: ${num}"
echo "根分区大小: ${allblk}"
echo "根分区使用率: ${useblk}"
echo "#################################"
echo "进程信息"
echo "进程总数: ${process_total}"
echo "运行中进程: ${process_run}"
echo "挂起进程数量: ${process_stop}"
echo "僵尸进程数量: ${process_zombie}"
echo "#################################"
临时更改编码,无中文
export LANG=en_US.UTF-8
