家用住宅主机Linux脚本监控服务器告警
很多朋友在家用住宅主机上跑着网站、NAS、下载机或开发环境,但服务器出问题(比如内存溢出、磁盘满了、进程挂掉)往往不能及时发现。
本文从零开始,教你编写一个 Linux 监控脚本,定时检测核心指标并自动推送告警,让你在手机上就能第一时间收到异常通知。
准备工作:一台普通 Linux 主机就够了
家用住宅主机通常是 Debian、Ubuntu 或 CentOS 系统。
你需要:
- 能通过 SSH 登录(或者直接接显示器操作)
- 拥有 sudo 或 root 权限
- 网络连通(用于发送告警消息)
- 如果使用邮件告警,安装 mailutils;如果使用钉钉/企业微信机器人,有对应的 Webhook URL。本文以钉钉机器人为例,无需安装额外软件。
编写监控脚本:检测 CPU、内存、磁盘和进程
在 /home/yourname/ 下新建文件 monitor.sh,粘贴以下内容:
#!/bin/bash
# 监控脚本 - 检测资源使用率,超过阈值则告警
# === 配置区域(根据你的情况修改) ===
CPU_THRESHOLD=90 # CPU 使用率百分比阈值
MEM_THRESHOLD=90 # 内存使用率百分比阈值
DISK_THRESHOLD=90 # 磁盘使用率百分比阈值
CHECK_PROCESS="nginx" # 要检测的关键进程名,多个用空格隔开
ALARM_URL="https://oapi.dingtalk.com/robot/send?access_token=你的TOKEN"
# ================================
# 获取当前状态
CPU_USAGE=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}' | cut -d. -f1)
MEM_USAGE=$(free | grep Mem | awk '{print $3/$2 * 100.0}' | cut -d. -f1)
DISK_USAGE=$(df / | tail -1 | awk '{print $5}' | tr -d '%')
ALARM_MSG=""
if [ "$CPU_USAGE" -gt "$CPU_THRESHOLD" ]; then
ALARM_MSG+="CPU 使用率 ${CPU_USAGE}%(阈值 ${CPU_THRESHOLD}%)\\n"
fi
if [ "$MEM_USAGE" -gt "$MEM_THRESHOLD" ]; then
ALARM_MSG+="内存使用率 ${MEM_USAGE}%(阈值 ${MEM_THRESHOLD}%)\\n"
fi
if [ "$DISK_USAGE" -gt "$DISK_THRESHOLD" ]; then
ALARM_MSG+="磁盘使用率 ${DISK_USAGE}%(阈值 ${DISK_THRESHOLD}%)\\n"
fi
# 检测指定进程是否存在
for proc in $CHECK_PROCESS; do
if ! pgrep -x "$proc" > /dev/null 2>&1; then
ALARM_MSG+="进程 ${proc} 未运行\\n"
fi
done
# 如果有异常,发送告警
if [ -n "$ALARM_MSG" ]; then
MESSAGE="【家用服务器告警】主机 $(hostname) 异常:\\n${ALARM_MSG}"
curl -s -H "Content-Type: application/json" -X POST -d "{\"msgtype\":\"text\",\"text\":{\"content\":\"$MESSAGE\"}}" "$ALARM_URL"
fi
保存后赋予执行权限:
chmod +x /home/yourname/monitor.sh
设置定时任务:让脚本自动运行
使用 crontab 添加计划任务,比如每 5 分钟检查一次:
crontab -e
在文件末尾添加一行:
*/5 * * * * /home/yourname/monitor.sh
保存退出。
crontab 会自动加载。
可以运行 crontab -l 查看是否添加成功。
避坑指南:常见报错与处理方法
1. top 命令未安装
部分最小化安装的系统没有 top,运行 apt install procps(Debian/Ubuntu)或 yum install procps-ng(CentOS)。
2. pgrep 找不到进程
确认进程名正确,可以用 ps aux | grep nginx 查看实际名称。如果进程名带路径或参数,建议使用 pgrep -f 替换 -x 做模糊匹配。
3. curl 命令缺失
先安装 curl:apt install curl 或 yum install curl。
4. 钉钉 Webhook 地址错误
检查 token 是否完整,不要有空格。建议先在命令行手动 curl 测试。
5. 脚本变量获取空值
可能因为语言环境问题,top -bn1 输出格式不一致。可以在脚本第一行加入 export LANG=en_US.UTF-8。
验证监控脚本是否生效
手动模拟告警
降低阈值临时测试,例如将 CPU_THRESHOLD 改为 1,然后执行脚本:
bash /home/yourname/monitor.sh
此时如果 CPU 使用率超过 1%(几乎必然),你的钉钉机器人应该能收到一条告警消息。
查看定时任务执行日志
在 crontab 中建议重定向输出到日志文件以便排查:
*/5 * * * * /home/yourname/monitor.sh >> /tmp/monitor.log 2>&1
然后查看 /tmp/monitor.log 是否有错误输出。
高频问题解答
Q:我不想用钉钉,可以用邮件吗?
可以。将告警部分的 curl 替换为 echo "$MESSAGE" | mail -s "服务器告警" your@email.com,前提是系统已配置好邮件发送服务(如 Postfix 或 msmtp)。
Q:监控多个磁盘怎么办?
修改 DISK_USAGE 部分,使用 df -h 循环每个挂载点,参考 df | grep '^/dev' 遍历。
Q:如何监控网络连通性?
在脚本中加入 ping -c 2 baidu.com &>/dev/null || ALARM_MSG+="网络不可达"。
Q:脚本执行有权限问题?
确保脚本所有者与定时任务执行用户一致,或使用绝对路径。不要放在 /tmp 等可能被清理的目录。
这套方案完全免费、零依赖(除 curl 外),适合大多数家用住宅主机。
你可以根据自己的需求扩展监控项(温度、端口、服务状态等),让家用服务器运行更安心。
如果遇到其他问题,欢迎对照避坑部分逐项检查。