postsuper -d ALL
将删除仍在后队列中的所有邮件,而不再发送它们。
但是当您调用此命令时文件系统上到底发生了什么?
我有一个带有 postfix 的邮件系统的快照。现在我想运行快照,但不想从后队列中发送剩余的邮件。
我想在将其作为正在运行的服务器启动之前手动清空本地安装的虚拟机映像中的后队列。最简单的方法就是删除后队列中的所有文件,那么postsuper -d ALL
具体是做什么的呢?
更新:
更复杂的解决方案是 chroot 到已安装的系统中:
mkdir /media/tmp/
mount /dev/vg0/vm01.tmp-disk-snapshot /media/tmp/
mount -t proc none /media/tmp/proc
mount --bind /dev /media/tmp/dev
mount -t sysfs sysfs /media/tmp/sys
chroot /media/tmp/ /bin/bash
清空后队列,以便测试虚拟机不会发送任何邮件并退出
postsuper -d ALL
exit
答案1
TLDR 该postsuper -d ALL
命令删除所有排队的消息文件,位于 postfix 排队目录下/var/spool/postfix/
。
长答案:
例如,后缀队列中有 3 条消息:
-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
8EDC660C92* 400 Sun May 10 13:42:22 [email protected]
[email protected]
7334B60C89 395 Sun May 10 13:37:59 [email protected]
(connect to mx.ptmail.sapo.pt[212.55.154.36]:25: Connection timed out)
[email protected]
4BD3A60C8D 407 Sun May 10 13:38:18 [email protected]
(connect to alt4.gmail-smtp-in.l.google.com[74.125.28.26]:25: Connection timed out)
[email protected]
-- 1 Kbytes in 3 Requests.
监控sudo postsuper -d ALL
已删除的文件:
30305 13:42:28.160381720 0 postsuper (1091) < unlink res=0 path=defer/7/7334B60C89(/var/spool/postfix/defer/7/7334B60C89)
30329 13:42:28.160423699 0 postsuper (1091) < unlink res=0 path=defer/4/4BD3A60C8D(/var/spool/postfix/defer/4/4BD3A60C8D)
30379 13:42:28.160481785 0 postsuper (1091) < unlink res=0 path=active/8EDC660C92(/var/spool/postfix/active/8EDC660C92)
30419 13:42:28.160537670 0 postsuper (1091) < unlink res=0 path=deferred/7/7334B60C89(/var/spool/postfix/deferred/7/7334B60C89)
30443 13:42:28.160574946 0 postsuper (1091) < unlink res=0 path=deferred/4/4BD3A60C8D(/var/spool/postfix/deferred/4/4BD3A60C8D)
其实,刚刚在源代码中发现postsuper
,选项-v(详细),显示了文件操作。
因此,postfix -vd ALL
对于上述队列,运行 的输出为:
postsuper: name_mask: all
postsuper: inet_addr_local: configured 2 IPv4 addresses
postsuper: queue: defer
postsuper: removed file defer/7/7334B60C89
postsuper: removed file defer/4/4BD3A60C8D
postsuper: queue: bounce
postsuper: queue: maildrop
postsuper: queue: incoming
postsuper: queue: active
postsuper: removed file active/8EDC660C92
postsuper: queue: deferred
postsuper: removed file deferred/7/7334B60C89
postsuper: removed file deferred/4/4BD3A60C8D
postsuper: queue: hold
postsuper: queue: flush
实际上,通过命令监控访问的目录,对于文件系统来说,apostfix -d ALL
相当于:
sudo find /var/spool/postfix/{defer,bounce,maildrop,incoming,active,deferred,hold,flush} -type f -exec rm {} \;
应用于已安装文件系统的示例情况的最后一个命令将是:
sudo find /media/tmp/var/spool/postfix/{defer,bounce,maildrop,incoming,active,deferred,hold,flush} -type f -exec rm {} \;
尽管如此,postsuper -d ALL
直接在目录和文件中操作,即在文件系统中 - 它不需要postfix
启动并运行服务来清除队列。直接删除文件的一种替代方法是在单一模式下启动服务器和/或在 postfix 服务未运行的情况下启动服务器,然后让其postsuper -d ALL
完成工作。
PS:find 命令“不必要地”复杂,必须枚举所有排队目录,原因是/var/spool/postfix
被设置为 chroot(至少在 Debian 中),并且在该子树区域下有二进制/库/dev/配置文件。