针对 Postfix tlsmgr 进程高 CPU 占用和"错误风暴"问题的修复脚本(由z.ai)

查看系统占用情况

top -c

这是一个专门针对 Postfix tlsmgr 进程高 CPU 占用和“错误风暴”问题的修复脚本。

📜 脚本说明

该脚本会自动执行以下操作:

  1. 检测权限:确保以 root 用户运行。
  2. 获取路径:自动识别 Postfix 的数据目录(data_directory)。
  3. 停止服务:安全停止 Postfix 服务。
  4. 清理缓存:删除损坏的 TLS 会话缓存文件和 PRNG 状态文件。
  5. 重启服务:启动 Postfix 并显示状态。

🧾 脚本内容

你可以将以下代码保存为 fix_postfix_tlsmgr.sh

#!/bin/bash
# ============================================================================
# Name        : fix_postfix_tlsmgr.sh
# Description : 解决 Postfix tlsmgr 进程 CPU 占用过高及日志报错问题
#               (warning: end-of-input while reading request from tlsmgr socket)
# Usage       : sudo bash fix_postfix_tlsmgr.sh
# ============================================================================
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
echo -e "${YELLOW}[INFO] 开始执行 Postfix tlsmgr 修复脚本...${NC}"
# 1. 检查是否为 root 用户
if [ "$EUID" -ne 0 ]; then
  echo -e "${RED}[ERROR] 请使用 root 权限运行此脚本 (sudo)。${NC}"
  exit 1
fi
# 2. 获取 Postfix 数据目录
# 通常为 /var/lib/postfix 或 /var/spool/postfix
DATA_DIR=$(postconf -h data_directory 2>/dev/null)
if [ -z "$DATA_DIR" ]; then
    echo -e "${RED}[ERROR] 无法获取 Postfix data_directory 配置。${NC}"
    echo -e "${YELLOW}[INFO] 尝试使用默认路径...${NC}"
    if [ -d "/var/lib/postfix" ]; then
        DATA_DIR="/var/lib/postfix"
    elif [ -d "/var/spool/postfix" ]; then
        DATA_DIR="/var/spool/postfix"
    else
        echo -e "${RED}[ERROR] 找不到 Postfix 数据目录,脚本退出。${NC}"
        exit 1
    fi
fi
echo -e "${GREEN}[STEP 1] 检测到 Postfix 数据目录: $DATA_DIR${NC}"
# 3. 停止 Postfix 服务
echo -e "${YELLOW}[STEP 2] 正在停止 Postfix 服务...${NC}"
if systemctl stop postfix; then
    echo -e "${GREEN}[OK] Postfix 已停止。${NC}"
else
    echo -e "${RED}[ERROR] 停止 Postfix 失败,请检查 systemd 状态。${NC}"
    exit 1
fi
# 4. 清理损坏的缓存文件
echo -e "${YELLOW}[STEP 3] 正在清理 TLS 缓存文件...${NC}"
# 定义需要删除的文件列表
# smtpd_scache*: SMTP服务端TLS会话缓存
# smtp_scache*:  SMTP客户端TLS会话缓存
# prng_exch:     伪随机数生成器状态文件
FILES_FOUND=0
# 使用循环处理文件,更安全
for pattern in "smtpd_scache*" "smtp_scache*" "prng_exch"; do
    # 查找匹配的文件
    for file in "$DATA_DIR"/$pattern; do
        if [ -e "$file" ]; then
            echo -e "   ${YELLOW}-> 删除文件: $file${NC}"
            rm -f "$file"
            FILES_FOUND=1
        fi
    done
done
if [ "$FILES_FOUND" -eq 1 ]; then
    echo -e "${GREEN}[OK] 缓存文件已清理。${NC}"
else
    echo -e "${YELLOW}[WARN] 未发现缓存文件,可能已被清理或路径错误。${NC}"
fi
# 5. 启动 Postfix 服务
echo -e "${YELLOW}[STEP 4] 正在启动 Postfix 服务...${NC}"
if systemctl start postfix; then
    echo -e "${GREEN}[OK] Postfix 已启动。${NC}"
else
    echo -e "${RED}[ERROR] 启动 Postfix 失败,请检查日志!${NC}"
    exit 1
fi
# 6. 验证状态
echo -e "${YELLOW}[STEP 5] 验证服务状态...${NC}"
sleep 1 # 等待服务初始化
if systemctl is-active --quiet postfix; then
    echo -e "${GREEN}========================================${NC}"
    echo -e "${GREEN}  修复完成!Postfix 运行正常。${NC}"
    echo -e "${GREEN}========================================${NC}"
    # 检查 CPU 状态
    echo -e "${YELLOW}[INFO] 当前 tlsmgr 进程状态:${NC}"
    ps aux | grep '[t]lsmgr' || echo "未发现 tlsmgr 进程(正常,按需启动)"
else
    echo -e "${RED}[ERROR] Postfix 未能成功启动,请立即查看系统日志。${NC}"
    exit 1
fi

🚀 使用方法

  1. 创建脚本文件
    vim fix_postfix_tlsmgr.sh
    
    (复制上面的代码粘贴进去,保存退出)
  2. 赋予执行权限
    chmod +x fix_postfix_tlsmgr.sh
    
  3. 运行脚本
    sudo ./fix_postfix_tlsmgr.sh
    

⚙️ 原理简述

tlsmgr 因缓存文件损坏陷入死循环时,CPU 会飙升。该脚本通过停止服务 -> 删除损坏的缓存文件 -> 重启服务,强制 Postfix 重建干净的缓存,从而消除高 CPU 占用和日志风暴。

posted @ 2026-08-09 16:59  POTUS88  阅读(2)  评论(0)    收藏  举报