家用住宅主机Linux预测性维护服务器状态监控脚本
家用主机长期开机,你遇到过这些情况吗?
很多朋友在家用旧电脑或树莓派上装了Linux系统做NAS、下载机或家庭服务器,经常一开就是几周甚至几个月。
系统偶尔卡死、磁盘突然满、CPU温度过高降频……等发现问题时,数据或硬件可能已经受损。
其实可以通过一个简单的Shell脚本定期检查关键状态,提前预警,这就是所谓的预测性维护。
本文从零开始教你写一个随手可用的监控脚本,并设置成自动运行。
前置准备:确认系统工具和权限
首先登录你的家用Linux主机(SSH或直接图形终端都可以)。
以下命令建议一次性执行,检查基本工具是否齐全:
# 检查常用系统命令
which top free df awk grep sensors smartctl 2>/dev/null || echo "部分工具缺失"
sensors用于读取CPU温度,如果没有安装,可以用sudo apt install lm-sensors(Debian/Ubuntu)或sudo yum install lm_sensors(CentOS)安装。smartctl是硬盘健康检测工具,安装方式:sudo apt install smartmontools。- 如果只是基础监控,缺少数值也可以直接用
/sys/class/thermal/thermal_zone*/temp读取温度。
为了执行脚本时能读取到硬件信息,建议给普通用户添加 sudo 权限(sensors 和 smartctl 通常需要root权限才能获取完整数据)。
如果你不熟悉sudo配置,也可以将脚本放在 /root/check_status.sh,然后通过crontab以root身份运行。
本文以普通用户+sudo方式举例。
编写一个轻量的状态监控脚本
新建文件 ~/check_status.sh,内容如下:
#!/bin/bash
# 家用Linux主机状态自检脚本,可用作预测性维护
LOGFILE="/var/log/host_monitor.log"
ALERT_FILE="/tmp/host_alert.txt"
# 时间戳
echo "===== $(date '+%Y-%m-%d %H:%M:%S') ====" | tee -a $LOGFILE
# 1. CPU平均负载(取1分钟和5分钟)
LOAD=$(cat /proc/loadavg | awk '{print $1,$2}')
echo "CPU负载(1min/5min): $LOAD" | tee -a $LOGFILE
if (( $(echo "$LOAD" | awk '{print $1}') > 2 )); then
echo "[警告] CPU负载过高(1min负载>2)" | tee -a $ALERT_FILE
fi
# 2. 内存使用率(取百分比)
MEM_USED=$(free -m | awk 'NR==2{printf "%.1f", $3*100/$2 }')
echo "内存使用率: $MEM_USED%" | tee -a $LOGFILE
if (( $(echo "$MEM_USED > 80" | bc -l) )); then
echo "[警告] 内存使用率超过80%" | tee -a $ALERT_FILE
fi
# 3. 磁盘使用率(取根分区)
DISK_USED=$(df -h / | awk 'NR==2{print $5}' | sed 's/%//')
echo "磁盘使用率(/): $DISK_USED%" | tee -a $LOGFILE
if [ $DISK_USED -gt 85 ]; then
echo "[警告] 根分区磁盘使用率超过85%" | tee -a $ALERT_FILE
fi
# 4. CPU温度(以摄氏度为单位)
TEMP=$(cat /sys/class/thermal/thermal_zone0/temp 2>/dev/null | awk '{printf "%.1f", $1/1000}')
if [ -n "$TEMP" ]; then
echo "CPU温度: $TEMP°C" | tee -a $LOGFILE
if (( $(echo "$TEMP > 75" | bc -l) )); then
echo "[警告] CPU温度超过75°C" | tee -a $ALERT_FILE
fi
else
echo "CPU温度: 无法读取(可能无thermal_zone)" | tee -a $LOGFILE
fi
# 5. 可选:硬盘SMART健康状态(需要sudo权限)
disk_list=$(lsblk -dn -o NAME | grep -E 'sd|nvme')
for disk in $disk_list; do
sudo smartctl -H /dev/$disk 2>/dev/null | grep -q "PASSED"
if [ $? -ne 0 ]; then
echo "[警告] 硬盘 /dev/$disk 健康状态异常,请检查" | tee -a $ALERT_FILE
fi
done
echo "脚本执行完毕,详情见日志和告警文件"
给脚本加执行权限:
chmod +x ~/check_status.sh
命令解释(零基础别跳过)
tee -a:同时将输出显示在屏幕并追加到文件。awk、sed:提取数值。bc -l:浮点数比较(如果系统没有bc,需要sudo apt install bc)。- 温度阈值75°C是保守值,你可以在脚本里按自己的散热条件修改。
- 告警写到了临时文件
/tmp/host_alert.txt,你可以定期检查或配置邮件提醒(本文不展开邮件)。
设置定时任务自动运行
使用cron让脚本每30分钟执行一次:
crontab -e
在打开的编辑器末尾添加一行(假设脚本路径为 /home/你的用户名/check_status.sh):
*/30 * * * * /home/你的用户名/check_status.sh
保存退出。
如果脚本中使用了sudo,则需要通过 sudo crontab -e 以root身份添加定时任务,并将脚本放到root可访问的路径。
验证cron是否生效:等5分钟看 /var/log/host_monitor.log 是否有内容生成。
或者手动执行一遍脚本看日志。
常见问题与避坑
Q:提示bc命令找不到怎么办?
A:运行 sudo apt install bc 或 sudo yum install bc 安装。如果不装bc,可以在脚本中改用整数比较(比如内存使用率只取整数部分)。
Q:CPU温度显示为0或读取失败?
A:检查 /sys/class/thermal/thermal_zone*/temp 是否存在,可能路径不同(如thermal_zone1)。可以用 ls /sys/class/thermal/ 查看所有可用zone。
Q:脚本中的告警文件一直产生内容怎么清理?
A:告警文件建议只记录最近一次异常,可以在脚本开头添加 > $ALERT_FILE 清空。如果需要保留历史,就改成追加(去掉重定向符号前加>>)。
Q:我不想用sudo,能监控硬盘SMART吗?
A:SMART一般需要root权限。如果不需要硬盘健康检查,可以注释掉smartctl部分,其他监控项普通用户通常够用。
Q:如何让告警发送到手机?
A:可以将告警内容通过邮件(mail命令)或钉钉/企业微信机器人发送。本文重点在基础监控脚本,高级通知可后续扩展。
验证脚本效果
手动运行一次脚本:
bash ~/check_status.sh
查看日志和告警:
cat /var/log/host_monitor.log
cat /tmp/host_alert.txt # 如果告警文件为空,说明一切正常
刻意制造一个异常(如用 stress 工具拉高CPU负载)后再次运行脚本,检查告警文件是否出现警告内容。
确认无误后,你的家用Linux主机就拥有了基础的预测性维护能力。
总结
这个脚本只用了不到40行代码,却覆盖了CPU负载、内存、磁盘、温度、硬盘健康五个维度的状态检测,并会在超阈值时生成告警。
将它加入crontab后,你只需要偶尔翻翻日志或告警文件,就能提前发现家用服务器的隐患。
如果未来需要更丰富的监控,也可以在这个脚本基础上增加网络连通性、进程数、SWAP使用率等指标。
如果你对Linux服务器运维的其它方面(比如数据备份、安全加固)感兴趣,可以继续查看博客上的相关教程。