“postsuper -d ALL”在文件系统上做什么?

“postsuper -d ALL”在文件系统上做什么?
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/配置文件。

相关内容