广告图片
TOP云-靠谱的企业级公有云服务平台

云服务器、物理服务器、云安全、SSL证书限时3折抢购!

双路E5-2640V4(40核)64G内存480G SSD硬盘30M独享带宽物理机仅需368元;香港铂金云服务器2H/2G/15M仅需19.8元/月;4H/4G/25M仅需29.8元/月,

TOP云-靠谱的企业级公有云服务平台:双路E5-2640V4(40核)64G内存480G SSD硬盘30M独享带宽物理机仅需368元;香港铂金云服务器2H/2G/15M仅需19.8元/月;4H/4G/25M仅需29.8元/月,云服务器、物理服务器、云安全、SSL证书限时3折抢购!点击这里立即抢购! 展开广告

TOP云物理服务器特惠,CPU可选双路E5-2660(32核)、双路E5-2680v2(40核)、双路E5-2696/98 V4(88核)、双路Gold 6138(80核)、双路Platinum 8173(112核);
内存从32G-128G可选,带宽有单线、多线独享20M-200M,价格低至368元。
购买链接:https://c.topyun.vip/cart?fid=1&gid=236

  在云服务器运维中,端口服务异常中断是常见问题,可能由程序崩溃、资源耗尽或配置错误导致。若未及时处理,会导致业务中断、用户访问失败等严重后果。通过编写端口自动恢复脚本,可实时检测端口状态,并在检测到异常时自动重启服务,大幅提升系统可用性。本文将提供完整的脚本实现方案,并推荐TOP云物理服务器特惠机型(立即选购),为企业构建高可用架构提供支持。

一、为什么需要端口自动恢复脚本?

1. 端口服务中断的常见原因

  • 程序崩溃:如Nginx、MySQL等进程意外终止(OOM Kill、代码Bug)。
  • 资源耗尽:端口连接数达到上限(如TIME_WAIT堆积)、内存不足。
  • 配置错误:服务未正确绑定端口(如监听127.0.0.1而非公网IP)。
  • 网络问题:防火墙规则变更、安全组拦截、云服务商网络波动。

2. 自动恢复脚本的核心价值

  • 零延迟故障修复:无需人工干预,脚本在检测到端口异常后立即重启服务。
  • 减少业务中断时间:将故障恢复时间(MTTR)从分钟级缩短至秒级。
  • 降低运维成本:避免因夜间或假期无人值守导致的长时间故障。

二、端口自动恢复脚本实现方案

方案1:Shell脚本 + Cron定时任务(轻量级方案)

1. 脚本逻辑
  • 使用netstatss命令检测目标端口是否处于监听状态。
  • 若端口未监听,则通过systemctlservice命令重启服务。
  • 记录操作日志,便于后续排查问题。
2. 完整脚本代码
Bash

#!/bin/bash
# 端口自动恢复脚本
# 用法:./port_recovery.sh <服务名> <端口号>

SERVICE_NAME=$1
PORT=$2
LOG_FILE="/var/log/port_recovery.log"

# 检测端口是否监听
is_port_listening() {
    # 使用ss命令(更高效)
    if ss -tuln | grep -q ":${PORT} "; then
        return 0 # 端口正常
    else
        return 1 # 端口未监听
    fi
}

# 重启服务
restart_service() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - 端口 ${PORT} 未监听,尝试重启服务 ${SERVICE_NAME}..." >> ${LOG_FILE}
    systemctl restart ${SERVICE_NAME} 2>> ${LOG_FILE}
    
    # 验证服务是否重启成功
    if systemctl is-active --quiet ${SERVICE_NAME}; then
        echo "$(date '+%Y-%m-%d %H:%M:%S') - 服务 ${SERVICE_NAME} 重启成功" >> ${LOG_FILE}
    else
        echo "$(date '+%Y-%m-%d %H:%M:%S') - 错误:服务 ${SERVICE_NAME} 重启失败!" >> ${LOG_FILE}
    fi
}

# 主逻辑
if is_port_listening; then
    echo "$(date '+%Y-%m-%d %H:%M:%S') - 端口 ${PORT} 状态正常" >> ${LOG_FILE}
else
    restart_service
fi
3. 配置Cron定时任务
  • 编辑Cron配置
    Bash

    crontab -e
  • 添加以下行(每分钟检查一次)
    Ini

    * * * * * /path/to/port_recovery.sh nginx 80
    * * * * * /path/to/port_recovery.sh mysqld 3306

方案2:Python脚本 + Supervisor进程管理(高级方案)

1. 脚本逻辑
  • 使用Python的socket模块尝试连接目标端口。
  • 若连接失败,则通过subprocess调用系统命令重启服务。
  • 集成Supervisor,确保脚本本身崩溃后自动重启。
2. 完整Python脚本代码
Python

#!/usr/bin/env python3
import socket
import subprocess
import time
from datetime import datetime

SERVICE_MAP = {
    "nginx": 80,
    "mysqld": 3306
}
LOG_FILE = "/var/log/port_recovery_py.log"

def check_port(port, timeout=3):
    """检测端口是否可连接"""
    try:
        with socket.create_connection(("127.0.0.1", port), timeout=timeout):
            return True
    except (socket.timeout, ConnectionRefusedError):
        return False

def restart_service(service_name):
    """重启服务并记录日志"""
    timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    log_msg = f"{timestamp} - 端口 {SERVICE_MAP[service_name]} 未响应,尝试重启 {service_name}..."
    
    try:
        subprocess.run(["systemctl", "restart", service_name], check=True)
        log_msg += " 重启成功"
    except subprocess.CalledProcessError:
        log_msg += " 错误:重启失败!"
    
    with open(LOG_FILE, "a") as f:
        f.write(log_msg + "\n")
    print(log_msg)

def main():
    """主逻辑"""
    while True:
        for service, port in SERVICE_MAP.items():
            if not check_port(port):
                restart_service(service)
        time.sleep(60)  # 每分钟检查一次

if __name__ == "__main__":
    main()
3. 配置Supervisor守护脚本
  • 安装Supervisor
    Bash

    # Ubuntu/Debian
    sudo apt install supervisor
  • 创建配置文件/etc/supervisor/conf.d/port_recovery.conf):
    Ini

    [program:port_recovery]
    command=/usr/bin/python3 /path/to/port_recovery.py
    directory=/path/to
    user=root
    autostart=true
    autorestart=true
    stderr_logfile=/var/log/port_recovery_py.err.log
    stdout_logfile=/var/log/port_recovery_py.out.log
  • 更新Supervisor配置并启动
    Bash

    sudo supervisorctl reread
    sudo supervisorctl update
    sudo supervisorctl start port_recovery

三、脚本优化建议

1. 避免频繁重启

  • 增加重试机制:首次检测到端口异常时,等待5秒后再次检测,确认故障后再重启。
  • 限制重启次数:记录24小时内重启次数,超过阈值(如5次)则停止重启并发送告警。

2. 集成告警通知

  • 邮件/短信告警:通过mail或企业微信/钉钉机器人发送故障通知。
  • 示例:调用企业微信机器人
    Bash

    # 在restart_service函数中添加
    curl -s -X POST "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=YOUR_KEY" \
      -H 'Content-Type: application/json' \
      -d '{
        "msgtype": "text",
        "text": {
          "content": "警告:服务 '"${SERVICE_NAME}"' 端口 '"${PORT}"' 未响应,已自动重启!"
        }
      }'

3. 支持多云环境

  • 兼容不同Linux发行版
    • 使用systemctl(Systemd)和service(SysVinit)兼容命令。
    Bash

    restart_service() {
        if command -v systemctl >/dev/null 2>&1; then
            systemctl restart ${SERVICE_NAME}
        elif command -v service >/dev/null 2>&1; then
            service ${SERVICE_NAME} restart
        else
            echo "错误:不支持的初始化系统" >> ${LOG_FILE}
            return 1
        fi
    }

四、TOP云物理服务器:为自动恢复脚本提供稳定运行环境

自动恢复脚本的可靠性依赖底层服务器的性能。TOP云物理服务器提供以下配置(立即购买),确保脚本7×24小时高效执行:

  1. 多核CPU快速处理检测任务
    • 双路E5-2696/98 V4(88核):并行检测数十个端口,避免延迟。
    • 双路Platinum 8173(112核):支撑超大规模端口监控(如金融、电商行业)。
  2. 大内存缓存日志数据
    • 内存从32G-128G可选,防止因内存不足导致脚本崩溃。
  3. 高带宽保障告警实时性
    • 提供单线、多线独享20M-200M带宽,确保故障告警秒级送达。

五、常见问题解答

Q1:如何检测UDP端口?

  • Shell脚本方案:使用ncnmap工具(需安装):
    Bash

    # 使用nc检测UDP端口(示例:检测DNS服务53端口)
    if echo | nc -u -w 3 127.0.0.1 53; then
        echo "UDP端口53正常"
    else
        echo "UDP端口53异常"
    fi
  • Python方案:修改check_port函数,使用socket.SOCK_DGRAM
    Python

    def check_udp_port(port, timeout=3):
        sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        sock.settimeout(timeout)
        try:
            sock.sendto(b"", ("127.0.0.1", port))
            data, _ = sock.recvfrom(1024)  # UDP需有服务响应
            return True
        except (socket.timeout, ConnectionRefusedError):
            return False
        finally:
            sock.close()

Q2:如何避免脚本被误杀?

  • 方案1:将脚本加入crontab@reboot任务,确保服务器重启后自动运行。
  • 方案2:使用Supervisor或Systemd管理脚本进程(推荐高级方案)。

Q3:如何记录端口历史状态?

  • 使用日志分析工具
    • 通过logrotate分割日志文件,避免单个文件过大。
    • 集成ELK(Elasticsearch+Logstash+Kibana)或Grafana Loki可视化日志数据。

立即行动:选购TOP云物理服务器,部署端口自动恢复脚本,让业务稳定性提升10倍!
点击购买

阿, 信