巡检Ubuntu服务器不是等它出问题才去查,而是每天用十几分钟把关键指标过一遍,把隐患提前挖出来。很多运维习惯登录后先看负载和内存,实际上磁盘、服务状态、日志、安全补丁、网络连接这些维度缺一不可。下面直接按日常巡检的操作顺序和重点展开。
先看系统负载与CPU状态登录服务器第一件事就是看负载,用uptime命令最直接。输出里最后三个数字分别代表1分钟、5分钟、15分钟的平均负载。如果1分钟数值明显高于CPU核心数,说明当前有任务堆积;如果15分钟持续高于核心数,就要查是什么进程在长期占用资源。接着用top或htop看CPU使用率,重点观察us(用户态)和sy(内核态)占比。sy长期偏高往往说明有大量系统调用或驱动问题,不是单纯加CPU能解决的。还要留意wa(IO等待),如果wa持续超过10%,瓶颈大概率在磁盘而不是CPU。
内存与交换分区检查用free -h查看内存和swap使用情况。很多人看到available很低就紧张,其实Linux内存机制会尽量用缓存,关键是看swap的使用量。如果swap已经用了很多,说明物理内存确实不够,或者有进程内存泄漏。可以通过vmstat 1 10观察si和so两列,如果so持续大于0,说明系统在频繁把内存页换出到swap,这时候就要定位是哪个进程占用内存过高。用ps aux --sort=-%mem | head -10可以快速列出内存占用前十的进程。对于Java类应用,还要结合jstat看堆内存使用趋势,避免只盯着系统层面。
磁盘空间与inode检查磁盘满是最常见的事故之一。用df -h查看各挂载点使用率,重点看根分区、/var、/home、/tmp这些容易堆积文件的位置。使用率超过80%就要开始清理或扩容。但只查空间不够,还要用df -i查inode使用情况。很多小文件场景比如邮件队列、缓存目录、会话文件,空间没满但inode耗尽,同样会导致无法创建新文件。可以用find / -xdev -type f | wc -l快速统计文件数量,再用du -sh /var/* | sort -rh | head -20定位大目录。对于日志文件,建议配置logrotate按大小或时间切割,避免单个日志文件无限增长。
服务运行状态巡检用systemctl list-units --type=service --state=running查看当前运行的服务,再对照预期清单确认关键服务是否都在。对于Nginx、MySQL、Redis、PHP-FPM这类核心服务,可以用systemctl status逐个检查,重点看Active状态和最近的日志输出。如果服务配置了开机自启,还要确认systemctl is-enabled服务名返回enabled。有些服务虽然进程在,但已经假死,比如Nginx进程存在但不响应请求,所以最好配合端口检测:ss -tlnp查看监听端口是否正常,再用curl -I http://localhost或对应端口做一次实际请求验证。对于数据库,可以执行一个简单查询比如SELECT 1来确认响应正常。
网络连接与端口检查用ss -s查看网络连接总数统计,如果TIME-WAIT数量异常高,可能是短连接请求过多或内核参数需要调优。用ss -tnp | head -20查看当前活跃连接,关注是否有异常的外部IP在大量连接。对于对外提供服务的端口,用ss -tlnp确认监听地址是否正确,比如MySQL只监听127.0.0.1还是0.0.0.0,这直接影响安全性。还要检查防火墙规则,用ufw status或iptables -L -n确认放行和拒绝的规则符合预期。如果服务器有多个网卡,用ip addr查看IP配置是否正常,用ip route查看默认路由是否正确。
日志异常扫描日志是发现问题的重要来源,但全量看日志不现实。日常巡检可以针对几个关键日志做异常过滤。用journalctl -p err -b查看本次启动以来的错误日志,用tail -n 100 /var/log/syslog看系统日志尾部,用grep -i "error\|fail\|critical" /var/log/nginx/error.log | tail -20扫描Nginx错误。对于认证相关日志,用grep "Failed password" /var/log/auth.log | tail -20检查是否有暴力破解尝试。如果发现某个IP有大量失败登录,可以直接用ufw deny from IP封禁。日志量大的服务器建议配置集中日志收集,但日常巡检至少要保证本地日志能快速定位到最近一小时内的异常。
安全补丁与系统更新Ubuntu的安全更新不能忽视。用apt list --upgradable查看可更新的包,重点看是否有security源的安全更新。可以用grep -i security /etc/apt/sources.list确认安全源已启用。执行apt update后,用apt list --upgradable | grep -i security过滤出安全相关更新。对于生产环境,不建议盲目全量升级,但安全补丁应该尽快评估并安装。还要用apt check检查依赖是否完整,用dpkg -l | grep -v "^ii"查看是否有安装异常或残留配置的包。另外,用unattended-upgrades可以配置自动安装安全更新,但需要确认不会影响业务。
定时任务与自动化脚本检查很多服务器靠cron执行备份、清理、同步等任务。用crontab -l查看当前用户的定时任务,用ls -l /etc/cron.d/ /etc/cron.daily/ /etc/cron.hourly/查看系统级任务。重点确认备份任务是否真的在执行,可以检查备份目录里最近的文件时间戳。用grep CRON /var/log/syslog | tail -20查看cron执行日志,如果有任务报错会在这里体现。对于自定义脚本,要确认脚本有执行权限、路径正确、退出码正常。有些任务依赖环境变量,在cron里执行时PATH可能不全,建议在脚本里写绝对路径或显式设置环境变量。
硬件与系统健康状态如果是物理服务器,用sensors查看CPU温度和风扇转速,用smartctl -a /dev/sda查看磁盘SMART信息,重点看Reallocated_Sector_Ct、Pending_Sector、Temperature等字段。如果是云服务器,这些信息可能拿不到,但可以用dmesg | tail -50查看内核日志,关注是否有硬件报错、OOM、磁盘IO错误等。用uptime确认系统没有意外重启,用last reboot查看重启历史。如果服务器频繁重启,要结合/var/log/syslog和journalctl查原因。
用户与权限审计用lastlog查看所有用户的最后登录时间,用who查看当前在线用户。用cat /etc/passwd确认系统用户列表,重点看是否有不该存在的用户或UID为0的异常账户。用cat /etc/sudoers或visudo -c检查sudo配置,确认哪些用户有sudo权限。用find / -perm -4000 -type f 2>/dev/null查看SUID文件,SUID文件如果被篡改是严重的安全隐患。对于SSH登录,用grep "Accepted" /var/log/auth.log | tail -20查看最近成功登录的IP和时间,确认没有异常来源。
备份有效性验证巡检不能只看备份任务是否执行,还要验证备份文件是否可用。检查备份目录里最近的文件大小是否合理,如果备份文件突然变小,可能备份不完整。对于数据库备份,可以定期做恢复演练,至少确认备份文件能正常解压或导入测试环境。用ls -lh /backup/ | tail -20查看最近备份文件,用tar -tzf backup.tar.gz | head -20抽查压缩包内容是否完整。如果使用rsync同步,可以对比源目录和备份目录的文件数量和总大小是否接近。
内核参数与系统资源限制用ulimit -a查看当前shell的资源限制,但服务进程的限制要看systemd或配置文件。用cat /etc/security/limits.conf查看全局限制,重点看nofile(文件描述符数)和nproc(进程数)。对于高并发服务,nofile默认1024往往不够,需要调大。用sysctl -a | grep -E "net.ipv4|net.core"查看网络相关内核参数,如果之前做过优化,要确认参数在重启后仍然生效。用cat /etc/sysctl.conf和ls /etc/sysctl.d/确认配置持久化。如果服务器运行时间很长,还要关注内存碎片和内核日志中的警告信息。
快速巡检脚本化手动执行上述命令每天重复很耗时,可以把常用检查项写成一个脚本,登录后执行一次就能看到汇总结果。下面是一个简单的巡检脚本示例:
#!/bin/bash echo "=== 系统负载 ===" uptime echo "=== 内存使用 ===" free -h echo "=== 磁盘空间 ===" df -h | grep -v tmpfs echo "=== inode使用 ===" df -i | grep -v tmpfs echo "=== 服务状态 ===" systemctl list-units --type=service --state=running | grep -E "nginx|mysql|redis|php" echo "=== 端口监听 ===" ss -tlnp | grep -E "80|443|3306|6379" echo "=== 错误日志 ===" journalctl -p err -b --no-pager | tail -20 echo "=== 可更新安全补丁 ===" apt list --upgradable 2>/dev/null | grep -i security echo "=== 最近登录 ===" grep "Accepted" /var/log/auth.log | tail -10
把脚本保存为/usr/local/bin/daily_check.sh并赋予执行权限,每天登录后执行一次,几秒钟就能掌握服务器整体状态。脚本可以根据实际业务调整检查项,比如增加数据库连接测试、备份文件检查等。
日常巡检的核心不是把每个指标都记下来,而是建立一套固定的检查路径,让异常能够快速暴露。负载、内存、磁盘、服务、日志、安全、备份这七类覆盖了绝大多数故障场景。坚持每天花十分钟走一遍,比出了问题再排查要高效得多。
