针对 Postfix tlsmgr 进程高 CPU 占用和"错误风暴"问题的修复脚本(由z.ai)
查看系统占用情况
top -c
这是一个专门针对 Postfix tlsmgr 进程高 CPU 占用和“错误风暴”问题的修复脚本。
📜 脚本说明
该脚本会自动执行以下操作:
- 检测权限:确保以 root 用户运行。
- 获取路径:自动识别 Postfix 的数据目录(
data_directory)。 - 停止服务:安全停止 Postfix 服务。
- 清理缓存:删除损坏的 TLS 会话缓存文件和 PRNG 状态文件。
- 重启服务:启动 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
🚀 使用方法
- 创建脚本文件:
(复制上面的代码粘贴进去,保存退出)vim fix_postfix_tlsmgr.sh - 赋予执行权限:
chmod +x fix_postfix_tlsmgr.sh - 运行脚本:
sudo ./fix_postfix_tlsmgr.sh
⚙️ 原理简述
当 tlsmgr 因缓存文件损坏陷入死循环时,CPU 会飙升。该脚本通过停止服务 -> 删除损坏的缓存文件 -> 重启服务,强制 Postfix 重建干净的缓存,从而消除高 CPU 占用和日志风暴。
浙公网安备 33010602011771号