【shell函数】【shell脚本】定期自动检查服务器磁盘使用情况并发出告警

函数就是把一堆命令打包起来,给它起个名字,后面直接用这个名字就能执行所有命令。就像你把 "刷牙 + 洗脸 + 擦脸" 打包成 "起床洗漱",以后直接说 "起床洗漱",就自动执行这三步,不用每次都重复写

复制代码
函数(){
命令
}

注意:函数的返回值,不是函数执行完成后,变量的结果,而是你是否函数运行成功了
0代表成功了,非0代表失败了

例子1

带错误处理的除法函数,专门用来做除法计算,还能防止除以零的问题

任务场景:定期自动检查服务器磁盘使用情况并发出告警

某公司需要确保其生产环境中的服务器磁盘空间不会耗尽,以免影响系统的正常运行。运维团队希望使用Shell脚本定期检查服务器磁盘使用情况,当某个磁盘分区的使用率超过设定的阈值时,自动发出告警信息(例如通过发送邮件或日志记录),以便运维团队及时处理

项目需求:

定期检查服务器上各个分区的磁盘使用情况

设定一个使用率的阈值(如80%),当某个分区的使用率超过此阈值时发出告

在告警时记录日志,并发送邮件给运维团队,提醒需要清理磁盘。

使用Shell函数实现各项功能,包括检查磁盘、记录日志和发送告警checkdiskusage(). alertdiskusage()

1,提前安装sendmail邮件服务

复制代码
yum install sendmail​
systemctl start sendmail​
systemctl enable sendmail

2,主机名称符合FQDN规范

FQDN = 功能 + 公司域名​

mysql.itcast.cn​

web.itcast.cn​

node1.itcast.cn​

node2.itcast.cn

复制代码
hostnamectl set-hostname node1.itcast.cn

3.编写脚本

复制代码
vim jiancha.sh

#!/bin/bash

#磁盘使用率,一般写80,测试用会写的小
threshold=1

send_mail(){
echo -e "您的磁盘:$disk_path 使用率为:$disk_usage \n已经超过阈值,立刻删库跑路" | sendmail -t "自己的邮箱地址"

}

disk_usage_check(){
        echo "开始检查磁盘"
#定义日期
current_time=$(date +"%F %T")

#获取磁盘使用率
df -h |grep "/dev/"|tail -2 |while read line
do


#获取磁盘路径
disk_path=$(echo $line|tr -s " "|cut -d " " -f1)

#获取磁盘使用率
disk_usage=$(echo $line|tr -s " "|cut -d " " -f5 | tr -d "%")

if [ $disk_usage -ge $threshold ];then
send_mail $disk_path $disk_usage
echo "$current_time - 您的磁盘:$disk_path 使用率为:$disk_usage ,已经超过阈值,立刻删库跑路 " >> $HOME/cipan.log
else
        echo "先别跑,还能摸鱼"
fi

done

}

disk_usage_check

#设置定时任务
crontab -e

知识点解析

复制代码
#获取磁盘使用率
df -h |grep "/dev/"|tail -2 |while read line

| while read line 到底在干嘛?

你可以把它理解成一个 "自动循环器":

  1. 前面的 df -h | grep "/dev/" | tail -2 会输出多行文本(比如两行磁盘信息)。

  2. | while read line 会一行一行地读取这些文本,每次读取一行,就把这行内容存到变量 line 里。

  3. 然后进入 dodone 之间的循环体,处理这一行的数据(比如提取磁盘路径、使用率)。

  4. 处理完第一行后,它会自动读取下一行,重复上面的过程,直到所有行都处理完

read 是 Shell 里用来读取输入并赋值给变量的命令,它最常见的用法有两种:

  1. 读取用户手动输入(比如 read name,用户敲什么,$name 就存什么)
  2. 读取管道传来的内容
复制代码
#获取磁盘路径
disk_path=$(echo $line|cut -d " " -f1)

$line 不是手动设置的,是 while read line 自动赋值的

这行的作用是$line 里提取出磁盘的路径(比如 /dev/sda1

假设 $line 现在存的是这行数据:

复制代码
/dev/sda1   20G  10G   10G  50% /
  1. echo $line 会把这行内容输出
  2. cut -d " " -f1 以空格分割后,取第 1 列,得到 /dev/sda1
  3. 最终 disk_path 变量的值就是 /dev/sda1
相关推荐
乘云数字DATABUFF3 天前
5分钟部署开源APM Databuff:OpenTelemetry全链路追踪入门实战
运维·后端
荣--5 天前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计
江华森5 天前
动手实战学 Docker — 从零到集群编排完全指南
运维
Avan_菜菜6 天前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
SelectDB7 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
zzzzzz3108 天前
9K Star 炸裂开源!这个 C 语言写的代码知识图谱,把 Linux 内核索引压缩到了 3 分钟
linux·服务器·sql
XIAOHEZIcode8 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220709 天前
如何搭建本地yum源(上)
运维
大树8812 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠12 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql