文章目录
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邮箱,其他邮箱对应的操作即可
- 登录qq邮箱 找到设置 - > 账号
- 账号往下翻,找到POP3/IMAP...,开启pop3/SMTP、IMAP/SMTP,点击生成授权码,手机验证
点击这里,按照他的操作,到最后会得到一个授权码复制先保存下来
- 进行配置对应的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 #证书目录
- 生成邮箱秘钥
后期使用中,用哪个账号发送邮件,就生成到谁的目录下!!
我用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
- 给与脚本权限
bash
chmod +x check_disk_usage.sh
- 设置定时任务
接下来,设置一个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 列,那么上述命令就是正确的。如果不是,请根据实际输出调整列号。