
Shell实战无限循环监控Nginx服务异常自动重启双份日志留存 前言 运维痛点线上Nginx、Web服务偶尔会因内存溢出、程序崩溃、端口占用意外宕机人工发现往往已经造成用户访问故障。靠人24小时盯着服务器完全不现实。本文分享一套纯Shell、零第三方组件、生产直接落地的服务实时监控脚本核心使用while true无限循环持续巡检每3秒检测一次80端口状态服务宕机自动重启同时区分正常/故障两套日志终端文件同步输出记录零基础跟着复制即可部署大幅提升网站可用性。✅ 脚本核心能力清单 无限循环实时监控Nginx自定义检测间隔默认3秒 通过80端口判断服务运行状态精准识别服务宕机 服务异常自动执行systemctl restart nginx重启服务 双日志分离存储正常巡检日志 故障重启日志方便故障溯源tee -a同步输出终端实时打印状态 持久写入日志文件 每条日志携带完整中文时间戳精准定位故障发生时间 兼容CentOS/Rocky Linux等主流Linux发行版⚠️ 前置环境要求服务器已安装并启用Nginx默认监听80端口拥有服务器root权限启停服务、创建日志目录基础命令认知vim、赋权、后台运行脚本、查看日志。一、前置核心知识点速学1.1 无限循环结构while true文字执行流程图开启循环 → 检测80端口状态 → 分支判断正常/宕机→ 打印并写入日志 → sleep 3 休眠 → 再次循环语法说明whiletruedo# 循环内执行代码sleep3# 控制循环间隔防止CPU满载donewhile true条件永久成立形成不间断实时监控sleep 数字强制休眠几秒降低脚本CPU占用生产必备。1.2 端口状态检测逻辑检测命令netstat-nltp|grep80/dev/nullnetstat -nltp列出本机所有TCP监听端口与对应进程grep 80过滤80端口相关进程 /dev/null屏蔽命令输出只保留执行状态界面干净逻辑取反!! 命令代表命令执行失败找不到80端口触发重启逻辑。1.3 日志核心命令tee -a普通只能写入文件屏幕看不到输出tee -a 日志文件同时完成两件事内容打印到当前终端追加写入目标日志文件不会覆盖历史记录。1.4 两套日志分离设计日志文件路径存储内容使用场景/shell/log/nginx_normal.log每轮正常巡检记录日常确认监控脚本正常运行/shell/log/nginx_error.logNginx宕机、自动重启记录故障排查、事后审计1.5 时间戳格式化$(date%y年%m月%d日%H时%M分%S秒)输出示例26年07月09日17时25分10秒每条日志绑定精确时间快速定位故障节点。二、完整生产可用脚本nginx_monitor.sh 脚本说明所有路径、检测间隔统一放在顶部新手按需修改无需改动核心循环逻辑#!/bin/bash# # 脚本名称nginx_monitor.sh# 功能循环实时监控Nginx 80端口宕机自动重启双日志记录# 检测间隔3秒# 正常日志/shell/log/nginx_normal.log# 故障日志/shell/log/nginx_error.log# 适用系统CentOS / Rocky Linux# 编写时间2026-07-09# ########################### 自定义配置区 ############################ 检测端口Nginx默认80CHECK_PORT80# 循环检测间隔单位秒SLEEP_TIME3# 日志存放目录LOG_DIR/shell/log# 两套日志文件NORMAL_LOG${LOG_DIR}/nginx_normal.logERROR_LOG${LOG_DIR}/nginx_error.log#################################################################### 自动创建日志目录不存在则新建mkdir-p${LOG_DIR}# 无限循环持续监控whiletruedo# 检测80端口是否存在输出全部屏蔽到黑洞netstat-nltp|grep${CHECK_PORT}/dev/null# ! 代表逻辑取反找不到端口服务宕机if[!$?-eq0];then# 捕获当前时间戳now_time$(date%y年%m月%d日%H时%M分%S秒)# 打印故障信息同时写入错误日志echo${now_time}- Nginx停止运行正在自动重启服务...|tee-a${ERROR_LOG}# 执行重启命令systemctl restart nginxelse# 服务正常写入正常巡检日志now_time$(date%y年%m月%d日%H时%M分%S秒)echo${now_time}- Nginx正常运行|tee-a${NORMAL_LOG}fi# 休眠指定秒数降低CPU消耗sleep${SLEEP_TIME}done2.1 分模块代码图文式讲解模块① 头部自定义配置区所有可变参数集中在顶部端口、检测间隔、日志路径适配不同业务场景。非80端口服务如8080、8090只需修改CHECK_PORT想缩短检测频率修改SLEEP_TIME1即可。模块② 自动创建日志目录mkdir-p${LOG_DIR}✅ 作用不存在/shell/log目录自动创建避免日志写入时报错中断监控。模块③ 核心无限循环框架whiletruedo# 检测判断逻辑sleep${SLEEP_TIME}done⚠️ 关键避坑循环内必须加sleep否则脚本会无限制疯狂占用CPU造成服务器负载飙升。模块④ 端口检测取反判断逻辑netstat-nltp|grep${CHECK_PORT}/dev/nullif[!$?-eq0];then$?上一条命令执行返回状态码返回0命令执行成功找到80端口服务正常! $? -eq 0 端口不存在Nginx已宕机执行重启逻辑。模块⑤ 双日志输出tee -aecho日志内容|tee-a日志文件运行效果终端实时打印文字同时追加写入日志文件运维不用反复cat日志查看状态。模块⑥ 服务重启命令systemctl restart nginx适配systemd系统一键重启Nginx支持开机自启服务。三、零基础完整部署测试步骤步骤1新建监控脚本 终端执行创建文件vimnginx_monitor.sh粘贴完整脚本按ESC输入:wq保存退出。步骤2赋予脚本执行权限 新建文件默认无执行权限直接运行会报错chmodx nginx_monitor.sh步骤3前台运行脚本手动测试效果 ./nginx_monitor.sh测试操作新开第二个终端窗口手动停止Nginx服务模拟宕机systemctl stop nginx观察运行脚本的终端自动打印故障提示、执行重启同时写入nginx_error.log等待3秒后脚本检测端口恢复打印正常运行日志验证端口是否恢复监听netstat-nltp|grep80预期输出示例26年07月09日17时30分10秒 - Nginx停止运行正在自动重启服务... 26年07月09日17时30分13秒 - Nginx正常运行步骤4查看两套日志记录 查看故障重启记录cat/shell/log/nginx_error.log查看日常正常巡检记录cat/shell/log/nginx_normal.log步骤5后台常驻运行生产必备⏰前台运行关闭终端会中断监控使用nohup后台常驻断开SSH也持续监控nohup./nginx_monitor.sh查看后台运行脚本jobs停止监控脚本kill 进程号四、生产环境避坑指南 ❌脚本CPU占用过高原因删除了sleep休眠代码解决保留sleep 3根据业务需求调整间隔。脚本无法重启Nginx原因无root权限解决使用root用户运行脚本。日志文件持续膨胀占满磁盘解决增加日志自动清理代码写入脚本最底部# 自动清理30天前的监控日志find/shell/log-namenginx_*.log-mtime30-delete关闭SSH后监控脚本停止解决使用nohup后台运行或搭配screen进程托管工具。端口检测误判解决确认netstat工具已安装最小化安装系统需执行yum install net-tools -y。五、脚本拓展升级方案 增加邮件告警结合之前部署的mailx服务重启自动发送告警邮件通知运维多服务批量监控循环遍历80、3306、6379等端口同时监控Nginx、MySQL、Redis告警防抖短时间内多次重启仅发送一次邮件避免消息轰炸日志轮转搭配logrotate工具自动分割日志防止单文件过大钉钉/企业微信机器人推送故障同步推送至运维群比邮件更及时。六、全文总结本案例是运维高频刚需的实时服务高可用监控脚本完整落地while无限循环、端口过滤判断、逻辑取反、tee双输出日志、后台常驻等核心Shell语法。脚本无任何复杂依赖零基础新手复制粘贴即可部署自动处理服务意外宕机减少人工值守成本大幅提升Web服务在线率可直接复用在生产服务器环境。同时这套循环监控思路通用替换端口与重启命令就能适配MySQL、Redis、Tomcat等所有后台服务。