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. 脚本逻辑
- 使用
netstat或ss命令检测目标端口是否处于监听状态。 - 若端口未监听,则通过
systemctl或service命令重启服务。 - 记录操作日志,便于后续排查问题。
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)兼容命令。
Bashrestart_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小时高效执行:
- 多核CPU快速处理检测任务:
- 双路E5-2696/98 V4(88核):并行检测数十个端口,避免延迟。
- 双路Platinum 8173(112核):支撑超大规模端口监控(如金融、电商行业)。
- 大内存缓存日志数据:
- 内存从32G-128G可选,防止因内存不足导致脚本崩溃。
- 高带宽保障告警实时性:
- 提供单线、多线独享20M-200M带宽,确保故障告警秒级送达。
五、常见问题解答
Q1:如何检测UDP端口?
- Shell脚本方案:使用
nc或nmap工具(需安装):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:Pythondef 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倍!
点击购买




