Shell实战:无限循环监控Nginx服务,异常自动重启+双份日志留存

Shell实战:无限循环监控Nginx服务,异常自动重启+双份日志留存

📌 前言

💡 运维痛点:线上Nginx、Web服务偶尔会因内存溢出、程序崩溃、端口占用意外宕机,人工发现往往已经造成用户访问故障。靠人24小时盯着服务器完全不现实。

本文分享一套纯Shell、零第三方组件、生产直接落地 的服务实时监控脚本,核心使用while true无限循环持续巡检,每3秒检测一次80端口状态,服务宕机自动重启,同时区分正常/故障两套日志,终端+文件同步输出记录,零基础跟着复制即可部署,大幅提升网站可用性。

✅ 脚本核心能力清单

  • 🟢 无限循环实时监控Nginx,自定义检测间隔(默认3秒)
  • 🟢 通过80端口判断服务运行状态,精准识别服务宕机
  • 🟢 服务异常自动执行systemctl restart nginx重启服务
  • 🟢 双日志分离存储:正常巡检日志 + 故障重启日志,方便故障溯源
  • 🟢 tee -a 同步输出:终端实时打印状态 + 持久写入日志文件
  • 🟢 每条日志携带完整中文时间戳,精准定位故障发生时间
  • 🟢 兼容CentOS/Rocky Linux等主流Linux发行版

⚠️ 前置环境要求

  1. 服务器已安装并启用Nginx,默认监听80端口;
  2. 拥有服务器root权限(启停服务、创建日志目录);
  3. 基础命令认知:vim、赋权、后台运行脚本、查看日志。

一、前置核心知识点速学

1.1 无限循环结构 while true

文字执行流程图

复制代码
开启循环 → 检测80端口状态 → 分支判断(正常/宕机)→ 打印并写入日志 → sleep 3 休眠 → 再次循环

语法说明:

bash 复制代码
while true
do
    # 循环内执行代码
    sleep 3 # 控制循环间隔,防止CPU满载
done
  • while true:条件永久成立,形成不间断实时监控;
  • sleep 数字:强制休眠几秒,降低脚本CPU占用,生产必备。

1.2 端口状态检测逻辑

检测命令:

bash 复制代码
netstat -nltp | grep 80 > /dev/null
  1. netstat -nltp:列出本机所有TCP监听端口与对应进程;
  2. grep 80:过滤80端口相关进程;
  3. > /dev/null:屏蔽命令输出,只保留执行状态,界面干净;
  4. 逻辑取反 !! 命令 代表命令执行失败(找不到80端口),触发重启逻辑。

1.3 日志核心命令 tee -a

普通>>只能写入文件,屏幕看不到输出;

tee -a 日志文件 同时完成两件事:

  1. 内容打印到当前终端;
  2. 追加写入目标日志文件,不会覆盖历史记录。

1.4 两套日志分离设计

日志文件路径 存储内容 使用场景
/shell/log/nginx_normal.log 每轮正常巡检记录 日常确认监控脚本正常运行
/shell/log/nginx_error.log Nginx宕机、自动重启记录 故障排查、事后审计

1.5 时间戳格式化

bash 复制代码
$(date +%y年%m月%d日%H时%M分%S秒)

输出示例:26年07月09日17时25分10秒,每条日志绑定精确时间,快速定位故障节点。


二、完整生产可用脚本 nginx_monitor.sh

📝 脚本说明:所有路径、检测间隔统一放在顶部,新手按需修改,无需改动核心循环逻辑

bash 复制代码
#!/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默认80
CHECK_PORT=80
# 循环检测间隔,单位秒
SLEEP_TIME=3
# 日志存放目录
LOG_DIR="/shell/log"
# 两套日志文件
NORMAL_LOG="${LOG_DIR}/nginx_normal.log"
ERROR_LOG="${LOG_DIR}/nginx_error.log"
###################################################################

# 自动创建日志目录,不存在则新建
mkdir -p ${LOG_DIR}

# 无限循环持续监控
while true
do
    # 检测80端口是否存在,输出全部屏蔽到黑洞
    netstat -nltp | grep ${CHECK_PORT} > /dev/null
    # ! 代表逻辑取反:找不到端口=服务宕机
    if [ ! $? -eq 0 ]; then
        # 捕获当前时间戳
        now_time=$(date +%y年%m月%d日%H时%M分%S秒)
        # 打印故障信息,同时写入错误日志
        echo "${now_time} - Nginx停止运行,正在自动重启服务..." | tee -a ${ERROR_LOG}
        # 执行重启命令
        systemctl restart nginx
    else
        # 服务正常,写入正常巡检日志
        now_time=$(date +%y年%m月%d日%H时%M分%S秒)
        echo "${now_time} - Nginx正常运行" | tee -a ${NORMAL_LOG}
    fi
    # 休眠指定秒数,降低CPU消耗
    sleep ${SLEEP_TIME}
done

2.1 分模块代码图文式讲解

模块① 头部自定义配置区

所有可变参数集中在顶部:端口、检测间隔、日志路径,适配不同业务场景。

  • 非80端口服务(如8080、8090)只需修改CHECK_PORT
  • 想缩短检测频率,修改SLEEP_TIME=1即可。

模块② 自动创建日志目录

bash 复制代码
mkdir -p ${LOG_DIR}

✅ 作用:不存在/shell/log目录自动创建,避免日志写入时报错中断监控。

模块③ 核心无限循环框架

bash 复制代码
while true
do
    # 检测+判断逻辑
    sleep ${SLEEP_TIME}
done

⚠️ 关键避坑:循环内必须加sleep,否则脚本会无限制疯狂占用CPU,造成服务器负载飙升。

模块④ 端口检测+取反判断逻辑

bash 复制代码
netstat -nltp | grep ${CHECK_PORT} > /dev/null
if [ ! $? -eq 0 ]; then
  • $?:上一条命令执行返回状态码;
  • 返回0=命令执行成功(找到80端口,服务正常);
  • ! $? -eq 0 = 端口不存在,Nginx已宕机,执行重启逻辑。

模块⑤ 双日志输出 tee -a

bash 复制代码
echo "日志内容" | tee -a 日志文件

运行效果:终端实时打印文字,同时追加写入日志文件,运维不用反复cat日志查看状态。

模块⑥ 服务重启命令

bash 复制代码
systemctl restart nginx

适配systemd系统,一键重启Nginx,支持开机自启服务。


三、零基础完整部署&测试步骤

步骤1:新建监控脚本 📄

终端执行创建文件

bash 复制代码
vim nginx_monitor.sh

粘贴完整脚本,按ESC输入:wq保存退出。

步骤2:赋予脚本执行权限 🔐

新建文件默认无执行权限,直接运行会报错

bash 复制代码
chmod +x nginx_monitor.sh

步骤3:前台运行脚本,手动测试效果 🧪

bash 复制代码
./nginx_monitor.sh

测试操作(新开第二个终端窗口)

  1. 手动停止Nginx服务模拟宕机
bash 复制代码
systemctl stop nginx
  1. 观察运行脚本的终端:
    自动打印故障提示、执行重启,同时写入nginx_error.log
  2. 等待3秒后脚本检测端口恢复,打印正常运行日志;
  3. 验证端口是否恢复监听
bash 复制代码
netstat -nltp | grep 80

预期输出示例

复制代码
26年07月09日17时30分10秒 - Nginx停止运行,正在自动重启服务...
26年07月09日17时30分13秒 - Nginx正常运行

步骤4:查看两套日志记录 📋

  1. 查看故障重启记录
bash 复制代码
cat /shell/log/nginx_error.log
  1. 查看日常正常巡检记录
bash 复制代码
cat /shell/log/nginx_normal.log

步骤5:后台常驻运行(生产必备)⏰

前台运行关闭终端会中断监控,使用nohup后台常驻,断开SSH也持续监控:

bash 复制代码
nohup ./nginx_monitor.sh &
  • 查看后台运行脚本:jobs
  • 停止监控脚本:kill 进程号

四、生产环境避坑指南 ❌

  1. 脚本CPU占用过高

    原因:删除了sleep休眠代码;

    解决:保留sleep 3,根据业务需求调整间隔。

  2. 脚本无法重启Nginx

    原因:无root权限;

    解决:使用root用户运行脚本。

  3. 日志文件持续膨胀占满磁盘

    解决:增加日志自动清理代码,写入脚本最底部:

bash 复制代码
# 自动清理30天前的监控日志
find /shell/log -name "nginx_*.log" -mtime +30 -delete
  1. 关闭SSH后监控脚本停止

    解决:使用nohup后台运行,或搭配screen进程托管工具。

  2. 端口检测误判

    解决:确认netstat工具已安装,最小化安装系统需执行yum install net-tools -y


五、脚本拓展升级方案 🚀

  1. 增加邮件告警:结合之前部署的mailx,服务重启自动发送告警邮件通知运维;
  2. 多服务批量监控:循环遍历80、3306、6379等端口,同时监控Nginx、MySQL、Redis;
  3. 告警防抖:短时间内多次重启仅发送一次邮件,避免消息轰炸;
  4. 日志轮转:搭配logrotate工具自动分割日志,防止单文件过大;
  5. 钉钉/企业微信机器人推送:故障同步推送至运维群,比邮件更及时。

六、全文总结

本案例是运维高频刚需的实时服务高可用监控脚本 ,完整落地while无限循环、端口过滤判断、逻辑取反、tee双输出日志、后台常驻等核心Shell语法。

脚本无任何复杂依赖,零基础新手复制粘贴即可部署,自动处理服务意外宕机,减少人工值守成本,大幅提升Web服务在线率,可直接复用在生产服务器环境。

同时这套循环监控思路通用,替换端口与重启命令,就能适配MySQL、Redis、Tomcat等所有后台服务。

相关推荐
Piko6142 小时前
锐捷 VSU 虚拟化堆叠配置
运维·网络·笔记
程序员吕洞宾2 小时前
开源多维表格SmartTable V1.6:自动化工作流,把重复操作交给系统即可
开源·自动化·github·多维表格·飞书多维表
ljs6482739512 小时前
Linux运维实操:vi编辑器永久配置静态IP(CentOS系列)
linux·运维·编辑器
dddwjzx2 小时前
嵌入式Linux C应用编程入门——高级I/O
linux·嵌入式
2301_780303902 小时前
网络安全、自动化运维、ERP、CRM、MES
运维·web安全·网络安全·自动化·安全威胁分析
csg11072 小时前
电路板抗干扰:电容、电感和弧线布线的应用
单片机·嵌入式硬件·物联网·自动化
IpdataCloud3 小时前
AI生成的Avalon恶意框架怎么防?用IP离线库识别模块化C2通信
运维·人工智能·网络协议·tcp/ip·ip
极客先躯3 小时前
高级java每日一道面试题-2026年03月30日-实战篇[Docker]-如何监控容器的网络流量?
java·运维·docker·容器·prometheus·高级面试
brave_zhao3 小时前
nginx的进程架构
java·学习·nginx
环境栈笔记3 小时前
多账号浏览器选型检查清单:Profile、权限、Session 和任务日志怎么评估
前端·人工智能·后端·自动化