Sendmail 8.18.2 常用 CLI 命令与工具详解

Sendmail 命令行工具族全景:sendmail 模式开关与身份自检、-bv/-bt 地址解析实测追踪、mailq 双队列管理、newaliases/makemap 标准流程与空输入重建事故、mailstats 路径差异、praliases 异常规避、smrsh 机制,8.18.2 与 8.15.2 双环境实测照抄。

SendmailSendmailUbuntu 22.04邮件服务器2026/10/27

Sendmail 8.18.2 常用 CLI 命令与工具详解

目标:掌握 Sendmail 日常运维的全部命令行工具——sendmail 主命令(-bp/-bi/-bv/-bt/-q 模式族)、mailq 队列管理、newaliases 别名维护、makemap 映射库编译、mailstats 收发统计、praliases/hoststat/purgestat/editmap 辅助工具与 smrsh 限制壳。全文以《Sendmail 8.18.2 Docker Compose 部署指南》搭建的 8.18.2 环境与《Ubuntu 22.04 安装 Sendmail 8.15.2 指南》搭建的 Ubuntu 22.04(8.15.2)环境为双基准实测(2026-10-27 取证),所有命令与回显现场照抄,两版差异如实标注。

一、工具全景与二进制布局

Sendmail 的命令行工具族有个独特设计:mailq、newaliases、hoststat、purgestat 全都是 sendmail 同一二进制的符号链接——sendmail 按被调用的名字(argv[0])切换行为。实测 8.18.2 环境的符号链接关系(ls -la 现场照抄):

lrwxrwxrwx 1 root root      18 Oct 27 03:40 /usr/bin/hoststat -> /usr/sbin/sendmail
lrwxrwxrwx 1 root root      18 Oct 27 03:40 /usr/bin/mailq -> /usr/sbin/sendmail
lrwxrwxrwx 1 root root      18 Oct 27 03:40 /usr/bin/newaliases -> /usr/sbin/sendmail
lrwxrwxrwx 1 root root      18 Oct 27 03:40 /usr/bin/purgestat -> /usr/sbin/sendmail
-r-xr-xr-x 1 bin  bin    94920 Oct 27 02:59 /usr/sbin/mailstats
-r-xr-xr-x 1 bin  bin   113856 Oct 27 02:59 /usr/sbin/makemap
-r-xr-xr-x 1 bin  bin   109464 Oct 27 02:59 /usr/sbin/praliases
-r-xr-sr-x 1 root smmsp 799128 Oct 27 02:59 /usr/sbin/sendmail
-r-xr-xr-x 1 bin  bin    90232 Oct 27 02:59 /usr/sbin/smrsh

注意主二进制的权限位 -r-xr-sr-x root smmsp——setgid smmsp(组位是 s),这正是普通用户能把信件投进 MSP 队列(/var/spool/clientmqueue)的权限机制。

Ubuntu 22.04(8.15.2)的工具布局完全不同:真实二进制集中在 /usr/libexec/sendmail/,经 Debian alternatives 机制软链进 PATH。实测全目录(ls -la /usr/libexec/sendmail/ 现场照抄):

total 1540
drwxr-xr-x 2 root root    4096 Oct 26 17:22 .
drwxr-xr-x 1 root root    4096 Oct 26 17:22 ..
-rwxr-xr-x 1 root root   95512 Dec  9  2021 editmap
lrwxrwxrwx 1 root root       8 Dec  9  2021 hoststat -> sendmail
-rwxr-xr-x 1 root root  107992 Dec  9  2021 mail.local
lrwxrwxrwx 1 root root       8 Dec  9  2021 mailq -> sendmail
-rwxr-sr-x 1 root smmsp  83160 Dec  9  2021 mailstats
-rwxr-xr-x 1 root root   99608 Dec  9  2021 makemap
lrwxrwxrwx 1 root root       8 Dec  9  2021 newaliases -> sendmail
-rwxr-xr-x 1 root root   99608 Dec  9  2021 praliases
lrwxrwxrwx 1 root root       8 Dec  9  2021 purgestat -> sendmail
-rwxr-sr-x 1 root smmsp 856888 Dec  9  2021 sendmail
-rwxr-xr-x 1 root root   79064 Dec  9  2021 smrsh
lrwxrwxrwx 1 root root       8 Dec  9  2021 smtpd -> sendmail
-rwxr-xr-x 1 root root  124600 Dec  9  2021 vacation.sendmail

实测 PATH 内的入口与链接链:

命令Ubuntu 22.04 实测链接链8.18.2 环境
sendmail/usr/sbin/sendmail -> /etc/alternatives/sendmail -> /usr/libexec/sendmail/sendmail/usr/sbin/sendmail(真身)
mailq/usr/bin/mailq -> /etc/alternatives/mailq -> /usr/share/sendmail/mailq(包装脚本)/usr/bin/mailq -> /usr/sbin/sendmail
newaliasesPATH 内不存在(仅 /usr/libexec/sendmail/newaliases -> sendmail)/usr/bin/newaliases -> /usr/sbin/sendmail
mailstats/usr/sbin/mailstats -> ../share/sendmail/mailstats/usr/sbin/mailstats
praliases/usr/sbin/praliases -> ../libexec/sendmail/praliases/usr/sbin/praliases
makemap/usr/sbin/makemap -> ../libexec/sendmail/makemap/usr/sbin/makemap
smrsh仅 /usr/libexec/sendmail/smrsh/usr/sbin/smrsh
editmap仅 /usr/libexec/sendmail/editmap未收录
mail.local/usr/libexec/sendmail/mail.local未收录(本地投递走 procmail)

两个高频踩坑由此而来:

  1. Ubuntu 上敲 newaliases 报 command not found——不是别名机制坏了,是 PATH 里没这个入口。等价命令:/usr/libexec/sendmail/newaliases、/usr/sbin/sendmail -bi,或 make -C /etc/mail(顺带重编全部库);
  2. Ubuntu 的 mailq 经 /usr/share/sendmail/mailq 包装脚本,行为与 sendmail -bp 等价但输出格式可能带 Debian 附加提示,脚本化解析时以 sendmail -bp 为准。

二、sendmail 主命令详解

2.1 模式开关(-b 系列)

sendmail 的行为由 -b<mode> 决定,一次只能选一个模式:

模式含义等价命令典型场景
-bd守护模式监听 25(后台 fork)—服务自启脚本
-bD守护模式但前台运行(PID 1 场景)—部署篇 CMD 所用
-bm默认:投递邮件后退出—命令行发信
-bp打印队列(只读)mailq队列巡检
-bi初始化/重编译别名库newaliases改别名后
-bv仅验证地址可达性,不投递—别名/路由排查
-bt地址解析测试模式(交互)—规则集调试
-bh输出主机状态缓存hoststat对端健康排查
-bH清除主机状态缓存purgestat状态缓存纠错

2.2 身份与配置选择(-Ac / -Am)

  • -Ac:使用 submit.cf 体系(MSP 角色,操作 /var/spool/clientmqueue);
  • -Am:使用 sendmail.cf 体系(MTA 角色,操作 /var/spool/mqueue,root 守护默认)。

部署篇的入口脚本就是双体系并跑的实例:MTA 前台 -bD + MSP 队列跑动 sendmail -Ac -q20m &。实测进程表(ps aux 节选):

root           1  0.0  0.0   6204  4032 ?        Ss   03:40   0:00 sendmail: accepting connections
smmsp         12  0.0  0.0   6048  2592 ?        Ss   03:40   0:00 sendmail: Queue runner@00:20:00 for /var/spool/clientmqueue

队列跑动进程的显示名 Queue runner@00:20:00 for /var/spool/clientmqueue 直接给出跑动间隔(20 分钟)与队列路径——巡检时一眼核对配置是否生效。

2.3 版本与身份自检(-d0.4)

sendmail -d0.4 -bt < /dev/null 输出版本、编译特性与身份四元组,是任何排障的第一步。实测(8.18.2,输出首尾照抄):

Version 8.18.2
 Compiled with: DNSMAP IPV6_FULL LOG MATCHGECOS MILTER MIME7TO8 MIME8TO7
		NAMED_BIND NETINET NETUNIX NEWDB=5.3 PIPELINING SCANF USERDB
		XDEBUG
Canonical name: mail.example.com
 UUCP nodename: mail.example.com
	a.k.a.: mail
	a.k.a.: [10.89.58.20]
	a.k.a.: [127.0.0.1]

============ SYSTEM IDENTITY (after readcf) ============
      (short domain name) $w = mail
  (canonical domain name) $j = mail.example.com
         (subdomain name) $m = example.com
              (node name) $k = mail.example.com
========================================================

ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
Enter <ruleset> <address>
>

读法:Compiled with 一行核对关键特性是否编入(NEWDB=5.3 哈希库支持、MILTER 过滤器协议、PIPELINING 流水线);IDENTITY 块的 $w(短主机名)、$j(规范域名)、$m(子域)、$k(节点名)决定 SMTP 横幅与 Message-Id——与配置篇 confDOMAIN_NAME 的呼应关系一目了然。Ubuntu 22.04 侧同命令实测为 Version 8.15.2、特性行多出 SASLv2 STARTTLS TCPWRAPPERS(apt 包编译特性更全),身份四元组同样正确($j = mail.example.com)。

2.4 地址验证(-bv)

-bv 只做地址解析不投递。实测 8.18.2 环境:

sendmail -bv admin

回显:

admin... deliverable: mailer local, user admin

deliverable: mailer local, user admin = 解析成功、经 local 投递代理落到本地用户 admin。换一个不存在用户:

sendmail -bv nosuchuser

回显(实测):

nosuchuser... User unknown

两版差异现象(实测在案):-bv postmaster 在 8.18.2 环境返回 postmaster... deliverable: mailer local, user root(别名已展开),而在 Ubuntu 22.04(8.15.2)环境返回 postmaster... User unknown——后者 -bv 走的链路不展开 MTA 侧别名库(Debian 提交体系特性)。判定别名是否生效不能只依赖 -bv,应结合实际投递与日志(排障实录见「十、」问题 3)。

2.5 地址解析追踪(-bt 与 /try)

-bt 进入交互测试模式,配合 /tryflags 与 /try 可以单步追踪规则集改写过程。实测追踪外发地址 admin@example.com 以 esmtp 代理处理(8.18.2,完整回显照抄):

$ printf '/tryflags HS\n/try esmtp admin@example.com\n/quit\n' | sendmail -bt
ADDRESS TEST MODE (ruleset 3 NOT automatically invoked)
Enter <ruleset> <address>
> > Trying header sender address admin@example.com for mailer esmtp
canonify           input: admin @ example . com
Canonify2          input: admin < @ example . com >
Canonify2        returns: admin < @ example . com . >
canonify         returns: admin < @ example . com . >
1                  input: admin < @ example . com . >
1                returns: admin < @ example . com . >
HdrFromSMTP        input: admin < @ example . com . >
PseudoToReal       input: admin < @ example . com . >
PseudoToReal     returns: admin < @ example . com . >
MasqSMTP           input: admin < @ example . com . >
MasqSMTP         returns: admin < @ example . com . >
MasqHdr            input: admin < @ example . com . >
MasqHdr          returns: admin < @ example . com . >
HdrFromSMTP      returns: admin < @ example . com . >
final              input: admin < @ example . com . >
final            returns: admin @ example . com
Rcode = 0, addr = admin@example.com
>

逐行读法:canonify 规范化地址(补尾点)、HdrFromSMTP/HdrFromL 头发件人处理、MasqSMTP/MasqHdr 伪装改写(genericstable 生效层)、final 输出最终形态;Rcode = 0 表示可投递。本地地址实测(/try local admin):走 HdrFromL 分支,final returns: admin,Rcode = 0——本地用户解析路径正确。/tryflags 取值:H(头地址)/E(信封地址)/S(发件人)/R(收件人),组合使用如 HS。

2.6 其他常用选项

选项语义备注
-f <发件人>指定信封发件人测试投递路径必备
-t从邮件头(To/Cc/Bcc)提取收件人命令行发信便利写法
-v详细模式,投递过程打到标准错误与 -bm 组合看每次投递尝试
-q<间隔>以守护身份每<间隔>跑一次队列如 -q30m
-O <选项>=<值>命令行覆盖 conf 参数如 -O DeliveryMode=b
-X <文件>全量调试日志(记录一切收发动作)输出量巨大,仅短时排障用

sendmail 的退出码遵循 sysexits.h 约定,脚本化调用时按码分支处理:

码符号含义
0EX_OK成功
64EX_USAGE命令行用法错误
65EX_DATAERR数据格式错误
67EX_NOUSER收件用户不存在
68EX_NOHOST主机名无法解析
69EX_UNAVAILABLE服务不可用(如映射库缺失)
75EX_TEMPFAIL暂时失败(应稍后重试)
77EX_NOPERM权限不足
78EX_CONFIG配置错误

三、mailq 与队列管理

3.1 查看队列

mailq(≡ sendmail -bp)查看 MTA 队列。实测(投递闭环完成后的健康态,8.18.2):

mailq

回显:

/var/spool/mqueue is empty
		Total requests: 0

MSP 客户端队列用 -Ac 切换体系查看:

mailq -Ac

回显:

/var/spool/clientmqueue is empty
		Total requests: 0

两条队列都空是「投递链路无滞留」的健康信号。任何邮件管理操作前先看这两条队列——队列里有信时重启/改配置都可能造成重复投递或滞留。

队列非空时的输出格式(标准格式,供识读):每个队列项一个块——首行 队列号、大小、入队时间、发件人,续行 (延迟原因) 与收件人列表;磁盘上对应两个文件:qf<队列号>(信封+控制信息)与 df<队列号>(信体),另有 tf(重建中的临时件)与 Qf(损坏隔离件)。队列号形如 69R3fEMY000014:日期字符+主机标识+进程内序号,可直接用于日志 grep。

3.2 队列跑动(-q)

命令语义实测情况
sendmail -q立即跑一遍队列后退出手工触发投递
sendmail -q30m守护方式每 30 分钟跑队列部署篇 CMD 在用
sendmail -qR<字符串>只跑收件人含<字符串>的队列项精准重试
sendmail -Ac -q20mMSP 体系队列跑动入口脚本在用

实测 -qR 的日志印证(Ubuntu 22.04 侧,改 access 规则后定向重跑,日志行照抄):

Oct 27 02:10:26 mail sm-mta[5978]: running queue: /var/spool/mqueue

-qR<域或地址片段> 与 -qI<队列号>(按队列号)是「改完 access/网络后只重试失败项」的精准工具,避免全队列重跑放大副作用。

四、newaliases 与别名维护

newaliases(≡ sendmail -bi)重编译 /etc/mail/aliases → aliases.db。实测(8.18.2,构建期自检回显,语义同手工执行):

/etc/mail/aliases: 3 aliases, longest 10 bytes, 52 bytes total

回显三段式即健康核对单:别名总数(3)、最长目标字节数(10)、库总字节数(52)。有语法错误(目标为空、格式残缺)时 newaliases 报错退出并保留旧库——生产环境改别名不怕手滑,旧映射继续生效。

标准改别名流程:

vi /etc/aliases            # 1) 编辑文本源(/etc/mail/aliases 是它的符号链接)
newaliases                 # 2) 重编译库(Ubuntu: /usr/sbin/sendmail -bi)
sendmail -bv <本地用户>     # 3) 抽查非别名目标的解析(注意 2.4 节的版本差异)

实测权限印证:重编译产物 aliases.db 属主 smmta:smmsp、权限 640(stat 照抄)——运行中的 MTA 以 smmta 身份读库,root 执行 newaliases 重写后属主自动归位,无需手工 chown。

五、makemap 与映射库工具

5.1 映射类型与基本语法

makemap 把文本源编译成 sendmail 运行时查询的哈希库。先看本机支持哪些类型(makemap -l 实测,Ubuntu 22.04 侧):

hash
btree

实测支持 hash 与 btree 两种(dbm 未编入)。日常全部用 hash。生成语法:

makemap hash <输出名> < <文本源>

四类映射库的标准生成命令(文本源与库文件同目录,库自动加 .db 后缀):

makemap hash /etc/mail/access < /etc/mail/access
makemap hash /etc/mail/virtusertable < /etc/mail/virtusertable
makemap hash /etc/mail/genericstable < /etc/mail/genericstable
makemap hash /etc/mail/mailertable < /etc/mail/mailertable

常用选项:

选项语义
-l列出可用映射类型
-o追加模式(保留库中已有条目)
-r允许重复键时替换旧值(默认报错)
-s跳过对键中危险字符的安全检查
-t <字符>自定义键值分隔符(默认空白)
-N键以 NUL 结尾(与某些库配合)
-v详细模式

5.2 真实事故:makemap 空输入重建(实测在案)

执行 makemap -d hash /etc/mail/access 时忘接输入重定向,stdin 立即 EOF——makemap 把「空输入」当作合法数据源,直接以空库覆盖了 access.db(时间戳实测更新为事故时刻,原 317 字节文本源对应的规则全部消失)。修复:从文本源重新编译即可完整还原:

makemap hash /etc/mail/access < /etc/mail/access    # 修复命令,实测 EXIT=0

修复后 .db 时间戳恢复更新且规则全部回位。教训:makemap 是「 stdin → 库」的单向编译器,交互敲命令时必须显式带上 < 文本源;顺带说明 -d 是「允许重复键」而不是很多人以为的 dump 模式——makemap 本身不提供库→文本的反向导出。

5.3 editmap 与库内容检视

makemap 只进不出,检视库内容的手段:

  • editmap(Ubuntu 侧 /usr/libexec/sendmail/editmap):交互式查询/编辑映射库,逐键查询命中值(8.18.2 环境未收录该工具);
  • praliases:别名库专用检视工具(异常现象见「十、」问题 2);
  • sendmail -bv/-bt:行为级验证——库改对了,解析结果立刻变化,比看库本身更可靠;
  • 时间戳核对:ls -l /etc/mail/*.db 与文本源对照,「.db 早于源」即漏编译(配置篇排障实录问题 3 的判定法)。

六、mailstats 收发统计

mailstats 读取统计文件输出各投递代理的收发计数。两版默认路径不同且都会踩空(排障实录问题 1),实测以 -f 显式指定最稳。

8.18.2 环境实测(统计文件在 /etc/mail/statistics):

mailstats -f /etc/mail/statistics

回显(新环境无累计,各列为 0):

Statistics from Tue Oct 27 04:08:52 2026
 M   msgsfr  bytes_from   msgsto    bytes_to  msgsrej msgsdis msgsqur  Mailer
=====================================================================
 T        0          0K        0          0K        0       0       0
 C        0                    0                    0

列语义:M 投递代理编号、msgsfr 经此代理发出的信数、bytes_from 发出字节(K 单位)、msgsto/bytes_to 收件方向同义、msgsrej 拒收数、msgsdis 丢弃数、msgsqur 清空数;T 行全代理合计、C 行连接计数。跑量后该表即为容量与滥用监控的现成数据源。

Ubuntu 22.04 侧实测(默认路径检索失败的现象):

MSP statistics...
mailstats: /var/lib/sendmail/sm-client.st: No such file or directory
MTA statistics...
mailstats: /var/lib/sendmail/sendmail.st: No such file or directory

Debian 包默认统计文件位于 /var/lib/sendmail/(MSP 用 sm-client.st、MTA 用 sendmail.st),新装环境两者都不存在——先创建空文件(touch /var/lib/sendmail/sendmail.st /var/lib/sendmail/sm-client.st 并给运行身份写权限)后 mailstats 才开始累计;或以 /var/log/mail.log 的 stat= 行统计替代。

七、praliases、editmap 与别名检视

praliases 设计用途是导出别名库内容。实测两套环境均异常(细节与规避见「十、」问题 2):

8.18.2 环境:

$ praliases
praliases: /etc/mail/aliases: open: Unknown database type
$ praliases -f /etc/mail/aliases.db
praliases: /etc/mail/aliases.db: open: Unknown database type

Ubuntu 22.04 侧默认执行则报 praliases: /etc/mail/aliases: open: Permission denied。

可用的替代检视路径(实测有效):直接读文本源 cat /etc/mail/aliases;行为验证用 sendmail -bv <本地用户> 与实际投递;库完整性用 newaliases 的重编译回显核对。

八、smrsh 与主机状态工具

8.1 smrsh——受限投递壳

别名目标写 |命令 时,命令由本地投递代理拉起执行——历史上这曾是命令注入的经典入口。smrsh(Sendmail Restricted Shell)只允许执行白名单目录内的程序:别名里写 |procmail 实际执行的是白名单目录下指向 procmail 的链接。

实测布局:8.18.2 环境内置 /usr/sbin/smrsh(-r-xr-xr-x bin bin);Ubuntu 侧二进制在 /usr/libexec/sendmail/smrsh。是否启用由 mc 的 FEATURE(smrsh) 决定:实测两套环境的默认配置都未启用(Ubuntu 的 sendmail.cf 中无 smrsh 字样,本地投递由 procmail 承担;8.18.2 的 generic-linux 模板同样未启用)。启用方法与白名单维护:

FEATURE(`smrsh')dnl   # 写入 sendmail.mc,make -C /etc/mail 重生成
ln -s /usr/bin/procmail /etc/mail/smrsh/procmail   # 白名单目录内建软链(目录以 FEATURE 参数指定)

启用后别名管道命令超出白名单即拒投,日志可见 Service unavailable 类记录。

8.2 hoststat / purgestat

hoststat(≡ sendmail -bh)输出对端主机的历史投递状态缓存(成功率/最近失败原因,供队列跑动做退避决策);purgestat(≡ sendmail -bH)清空该缓存。实测 8.18.2 环境 hoststat 输出为空——未启用主机状态目录(confHOST_STATUS_DIRECTORY 未定义)时无数据可列,属正常现象而非故障。需要该功能时在 mc 中启用 hoststatus 相关参数并重生成 cf。

8.3 SMTP 协议层自检(HELP)

排障利器其实是协议本身。实测 8.18.2 横幅与 HELP 响应(/dev/tcp 直连本机 25 端口,回显照抄):

220 mail.example.com ESMTP Sendmail 8.18.2/8.18.2; Tue, 27 Oct 2026 04:30:49 GMT
214-2.0.0 This is sendmail version 8.18.2
214-2.0.0 Topics:
214-2.0.0 	HELO	EHLO	MAIL	RCPT	DATA
214-2.0.0 	RSET	NOOP	QUIT	HELP	VRFY
214-2.0.0 	EXPN	VERB	ETRN	DSN	AUTH
214-2.0.0 	STARTTLS
214-2.0.0 For more info use "HELP <topic>".
214-2.0.0 To report bugs in the implementation see
214-2.0.0 	http://www.sendmail.org/email-addresses.html
214-2.0.0 For local information send email to Postmaster at your site.
214 2.0.0 End of HELP info

横幅核对三要素:域名(confDOMAIN_NAME 生效)、版本(8.18.2/8.18.2)、时间;HELP 的 Topics 列表即本机支持的 SMTP 动词集,HELP 文案来自 /etc/mail/helpfile。

九、运维实战手册

9.1 每日巡检命令链

mailq && mailq -Ac          # 双队列滞留检查(健康态应双双为空)
mailstats -f /etc/mail/statistics   # 收发与拒收计数(8.15.2: -f /var/lib/sendmail/sendmail.st)
tail -50 /var/log/mail.log  # 最近投递审计(grep 'stat=' 看成败)
ss -ltn | grep ':25 '       # 端口监听健在
sendmail -d0.4 -bt < /dev/null   # 版本/身份/编译特性自检(< /dev/null 防交互挂起)

日志行读法(现场样例):mailer=local ... stat=Sent 为本地落箱成功;stat=Deferred: ... 为暂时失败将自动重试;ruleset=check_rcpt ... reject=550 为规则拦截(中继拒绝/黑名单命中)。

9.2 队列卡信处理五步

  1. mailq 看滞留项的 (原因) 行——DNS 失败/对端拒收/超时各不同;
  2. sendmail -qR<域> 定向重试单项(改完网络/DNS 后先试一发);
  3. sendmail -v -bm -f 测试发件人 <地址> 实投一封测试信,-v 打出逐跳过程;
  4. 确认死信(对端永久拒收):sendmail -qI<队列号> -v 单项处理,或将 qf/df 文件移出队列目录隔离(移出即放弃投递);
  5. 检查 df 有 qf 无的孤儿数据件——直接清理磁盘,无投递意义。

9.3 别名与映射库变更 SOP

vi /etc/aliases && newaliases                      # 别名链
vi /etc/mail/access && makemap hash /etc/mail/access < /etc/mail/access   # 访问控制链
vi /etc/mail/virtusertable && makemap hash /etc/mail/virtusertable < /etc/mail/virtusertable
ls -l /etc/mail/*.db                                # 时间戳核对(必须晚于文本源)

映射库变更不需要重启——规则集每次查询都读库;mc/FEATURE/define 变更才需要重生成 cf 并重载服务(配置篇「生效流程与验证」)。

9.4 长输出防断管纪律

编译/批量诊断类命令(sh Build、全量日志检索)输出动辄数千行,直连管道传输时一旦读端提前关闭即触发 SIGPIPE 使命令中断(部署篇排障实录问题 3 的构建事故同源)。纪律:长输出一律先全量重定向到文件,再 tail/grep 取回显——本文所有实测回显均按此纪律采集。

十、排障实录

以下五则均为本次实测过程中的真实现象,按「现象 → 已知规避」如实记录:

问题 1:mailstats: no statistics file located(8.18.2)与默认路径 No such file(8.15.2)。

8.18.2 环境裸执行 mailstats 报 mailstats: no statistics file located——默认搜索路径不含 /etc/mail/statistics;Ubuntu 22.04 侧默认检索 /var/lib/sendmail/sm-client.st 与 /var/lib/sendmail/sendmail.st,新装环境两者均不存在(实测回显见「六、」)。已知规避:统一用 -f 显式指定——8.18.2 用 -f /etc/mail/statistics(实测可用);8.15.2 先 touch 创建默认路径文件再统计,或以日志 stat= 行统计替代。

问题 2:praliases 两套环境均无法导出。

现象:8.18.2 环境裸执行与 -f /etc/mail/aliases.db 显式路径均报 Unknown database type;Ubuntu 22.04 侧报 Permission denied(回显见「七、」)。已知规避:改用文本源直接检视(cat /etc/aliases)、行为验证(sendmail -bv)与 newaliases 重编译回显核对库完整性。该工具在本两套环境判定为不可用,未继续深挖(不影响别名机制本身——newaliases 写库、MTA 读库链路实测正常)。

问题 3:-bv postmaster 两版行为相反。

8.18.2 环境返回 postmaster... deliverable: mailer local, user root(别名展开);Ubuntu 22.04(8.15.2)返回 postmaster... User unknown(别名未展开,Debian 提交链路特性,回显见「2.4」)。已知规避:判定别名生效与否以实际投递与 /var/log/mail.log 为准,-bv 仅用于非别名本地用户的可达性抽查。

问题 4:makemap 空输入静默重建空库。

现象与修复全记录见「5.2」——stdin 立即 EOF 时 makemap 不报错、直接以空数据覆盖 .db。已知规避:命令必须显式带 < 文本源;变更后立即 ls -l 核对 .db 时间戳与 newaliases 式回显核对。

问题 5:hoststat 无输出。

现象:8.18.2 环境执行 hoststat 零输出。已知规避:属正常现象(confHOST_STATUS_DIRECTORY 未定义即无主机状态缓存);确需主机状态功能时在 mc 中启用该参数并重生成 cf,再观察 hoststat 输出。

十一、参考链接