Shell脚本实现服务器在线状态监控
介绍
每分钟ping4次服务器IP,取平均值并取整,将时间、IP、ping值存于日志,保存3天文件,若连续3分钟ping为0,则发送服务器掉线通知,直到ping值不为0发送服务器上线通知。
需要安装mutt及msmtp并配置好SMTP,见使用Shell脚本获取雨天并发送通知邮件 - MJ的博客
脚本
脚本整体由ChatGPT生成,我只负责输入人话需求及小幅修改脚本。
vim ping.sh
#!/bin/bash
# 定义变量
ip="your_server_ip" #域名应该也行
log_dir="替换为日志文件夹路径"
email="替换你的收信邮箱"
offline_notification_sent=false
ping_fail_count=0
# 检查日志目录是否存在,不存在则创建
if [ ! -d $log_dir ]; then
mkdir -p $log_dir
fi
# 无限循环
while :
do
# 计算当前日期
date_str=$(date +"%Y-%m-%d")
# ping服务器4次,计算平均值
ping_result=$(ping -c 4 $ip | tail -1 | awk '{print $4}' | cut -d '/' -f 2 | awk '{printf("%d\n",$1 + 0.5)}')
# 记录到log文件中
log_file="$log_dir/ping-$date_str.log"
echo "$(date +"%Y-%m-%d %H:%M:%S") 服务器 $ip 的ping值为 $ping_result ms" >> $log_file
# 判断服务器是否掉线
if [ $ping_result -eq 0 ]; then
((ping_fail_count++))
if [ $ping_fail_count -eq 3 ] && [ "$offline_notification_sent" = false ]; then
echo "$(date +%Y-%m-%d\ %H:%M:%S) 服务器 $ip 已掉线!" | mutt -s "服务器掉线通知" $email
offline_notification_sent=true
fi
else
ping_fail_count=0
if [ "$offline_notification_sent" = true ]; then
echo "$(date +%Y-%m-%d\ %H:%M:%S) 服务器 $ip 已恢复在线!" | mutt -s "服务器上线通知" $email
offline_notification_sent=false
fi
fi
# 清理3天前的日志文件
find $log_dir -type f -name "ping-*" -mtime +2 -exec rm {} \;
# 休眠1分钟
sleep 60
done
添加执行权限
chmod +x ping.sh
后台运行
nohup ~/ping/ping.sh & # 换成你的脚本路径
查看进程,结束进程
ps -le | grep ping
kill 脚本的pid
效果
测试下运行效果,手动开关vps,ping间隔调为10s。
可以正常收到邮件