【linux】linux监控硬盘达到使用情况,进行邮箱通知

文章目录

linux监控硬盘达到使用情况,进行邮箱通知

需要使用到的工具:一台linux系统的服务器

安装的软件:smartmontools mailutils

安装要用到的软件

bash 复制代码
yum install smartmontools -y # 安装smartmontools
yum  -y install mailx -y # 安装mailutils
yum install dos2unix -y # 安装dos2unix 

配置smartmontools

安装好smartmontools一会会在etc下面出现一个这个文件夹

编辑/etc/smartmontools/smartd.conf配置文件,设置对硬盘的监控。

bash 复制代码
# 找到 DEVICESCAN 行,并取消注释
DEVICESCAN -H -m root@example.com

这里的-H选项会在硬盘发生故障时发送警告邮件给root用户。-m后跟的是接收警告的邮箱地址。

配置mail

我这里使用的是qq邮箱,其他邮箱对应的操作即可

  1. 登录qq邮箱 找到设置 - > 账号
  2. 账号往下翻,找到POP3/IMAP...,开启pop3/SMTP、IMAP/SMTP,点击生成授权码,手机验证

    点击这里,按照他的操作,到最后会得到一个授权码复制先保存下来
  3. 进行配置对应的mail
    mail命令的系统级配置文件是/etc/mail.rc
bash 复制代码
vi  /etc/mail.rc
# 最好是使用可视化进行操作,把对应的给配置上即可,有些配置已经给配置好了,不需要再次进行配置
set bsdcompat
set from=1111111@qq.com    #设置邮件发送方
set smtp=smtps://smtp.qq.com:465  #邮件服务器,我这里是qq
set smtp-auth-user=1111111@qq.com	#smtp验证用户邮箱
set smtp-auth-password=cdesllrlz111111 #邮箱授权码
set smtp-auth=login 	#认证方式
set ssl-verify=ignore	#忽略SSL验证
set nss-config-dir=/root/.certs   #证书目录
  1. 生成邮箱秘钥
    后期使用中,用哪个账号发送邮件,就生成到谁的目录下!!
    我用root 证书目录为/root/.certs
bash 复制代码
sudo mkdir -p  /root/.certs   #创建证书目录
sudo bash -c "echo -n | openssl s_client -connect smtp.qq.com:465 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > /root/.certs/qq.crt  "   #获取邮件服务器证书
sudo chmod +x /root/.certs/qq.crt       #qq.crt 添加执行权限
sudo bash -c 'certutil -A -n "GeoTrust Global CA" -t "C,," -d /root/.certs -i /root/.certs/qq.crt'   #添加global证书到数据库
sudo bash -c 'certutil -A -n "GeoTrust SSL CA" -t "C,," -d /root/.certs -i /root/.certs/qq.crt' #添加SSL证书到数据库
sudo bash -c 'certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu" -d  /root/.certs -i /root/.certs/qq.crt' #指定受信任证书,防报错

注:执行sudo bash -c 'certutil -A -n "GeoTrust SSL CA - G3" -t "Pu,Pu,Pu" -d /root/.certs -i /root/.certs/qq.crt'

会跳出"Notice: Trust flag u is set automatically if the private key is present."

bash 复制代码
sudo certutil -L -d /root/.certs  
#列出安全数据库中的证书

这里有证书列出来,证明配置成功了

可以通过命令进行测试是否安装正常

bash 复制代码
echo "信息内容" | mail -s "标题" your_email@example.com 

写执行的脚本,进行邮箱通知

创建一个监控硬盘占用率的脚本check_disk_usage.sh:

bash 复制代码
#!/bin/bash

# 设置邮箱地址
EMAIL="your_email@example.com"

# 设置要监控的挂载点
MOUNT_POINT="/"

# 设置占用率阈值
THRESHOLD=95

# 获取当前硬盘占用率
USAGE=$(df | grep$MOUNT_POINT | awk '{print $5}' | sed 's/%//g')

# 检查是否达到阈值
if [ "$USAGE" -ge "$THRESHOLD" ]; then
    # 获取硬盘使用详细信息
    USAGE_DETAIL=$(df -h$MOUNT_POINT)
    # 发送邮件
    echo "警告: $MOUNT_POINT 硬盘占用率已达到${THRESHOLD}% 或以上。$USAGE_DETAIL" | mail -s "硬盘占用率警告"$EMAIL
fi
  1. 给与脚本权限
bash 复制代码
chmod +x check_disk_usage.sh
  1. 设置定时任务
    接下来,设置一个cron定时任务来定期执行这个脚本。
bash 复制代码
crontab -e

在打开的文件中添加以下行来设置定时任务:

这个脚本是五分钟去执行一次刚才创建好的脚本

bash 复制代码
*/5 * * * * /path/to/check_disk_usage.sh

测试脚本是否写好,可以通过 ./check_disk_usage.sh执行脚本,查看是否有报错信息

调试脚本可以通过

bash 复制代码
# 启用调试模式
set -x
# 关闭调试模式
set +x

这里有一个问题,

问题出在USAGE变量没有被正确设置。这可能是由于df命令的输出格式与脚本中的awk和grep命令期望的格式不匹配。你需要检查df命令的输出,然后相应地调整脚本中的命令。

以下是你可以执行的一个命令,来查看df命令的实际输出:

bash 复制代码
df | grep ' / '

根据输出,你可能需要调整awk命令中的字段索引(例如,如果占用率在第六列,你应该使用6而不是5)。

一旦你确定了正确的字段索引,你可以更新脚本中的相应部分,如下所示:

bash 复制代码
USAGE=$(df | grep "$MOUNT_POINT " | awk '{print $5}' | sed 's/%//g')

确保$5是df命令输出中占用率所在的实际列。

如果 df | grep ' / ' 没有任何输出,换用

bash 复制代码
df | grep ' /$'

查看是否有输出

注意,这里使用了正则表达式中的 $ 符号,它表示行的末尾,这样可以确保只匹配那些以 / 结尾的行。

接下来,你可以更新脚本中的 USAGE 变量赋值行,确保它能够正确地从 df 命令的输出中提取使用率。例如:

bash 复制代码
USAGE=$(df | grep ' /$' | awk '{print $5}' | sed 's/%//g')

请确保 awk 中的 {print $5} 与 df 命令输出中磁盘使用百分比的列相对应。如果使用百分比的列是第 5 列,那么上述命令就是正确的。如果不是,请根据实际输出调整列号。

相关推荐
Chennnng1 小时前
Ubuntu 安装过程的 6 大常见问题类型
linux·运维·ubuntu
阿干tkl1 小时前
传统网络与NetworkManager对比
linux·网络
Evan芙2 小时前
Linux 进程状态与进程管理命令
linux·运维·服务器
doris6102 小时前
2025年设备管理系统:智能运维成新标杆
运维
qsjming2 小时前
EXT4文件系统特性说明
运维
码农12138号2 小时前
Bugku HackINI 2022 Whois 详解
linux·web安全·ctf·命令执行·bugku·换行符
Joren的学习记录3 小时前
【Linux运维进阶知识】Nginx负载均衡
linux·运维·nginx
用户2190326527353 小时前
Java后端必须的Docker 部署 Redis 集群完整指南
linux·后端
胡先生不姓胡3 小时前
如何获取跨系统调用的函数调用栈
linux
Jtti3 小时前
服务器防御SYN Flood攻击的方法
运维·服务器