web-dev-qa-db-ja.com

「postsuper -d ALL」はファイルシステムで何をしますか?

postsuper -d ALL

ポストキューに残っているすべてのメールを、再度送信せずに削除します。

しかし、このコマンドを呼び出すと、ファイルシステムで正確に何が起こっていますか?

Postfixを含むメールシステムのスナップショットがあります。スナップショットを実行したいが、ポストキューから残りのメールを送信したくない。

実行中のサーバーとして起動する前に、ローカルにマウントされたVMイメージのpostqueueを手動で空にしたいと思います。最も簡単な方法は、postqueue内のすべてのファイルを削除することです。そのため、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

テストからメールが送信されないようにポストキューを空にしますVMそして終了します

postsuper -d ALL
exit
2
rubo77

TLDR postsuper -d ALLコマンドは、/var/spool/postfix/の下のpostfixキューイングディレクトリにある、キューに入れられたすべてのメッセージファイルを削除します。

長い答え:

例として、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(verbose)は、ファイル操作を示します。

したがって、上記のキューに対して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

実際には、訪問したディレクトリをコマンドで監視し、ファイルシステムではpostfix -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はディレクトリとファイル、つまりファイルシステムで直接動作します。キューをクリアするためにpostfixserviceを起動して実行する必要はありません。ファイルを直接削除する1つの方法は、サーバーをシングルモードで起動するか、Postfixサービスを実行せずにpostsuper -d ALLにジョブを実行させることです。

PS /var/spool/postfixがchroot(少なくともDebianでは)としてセットアップされており、そのサブツリー領域の下にバイナリ/ライブラリ/ dev /設定ファイルがあるため、findコマンドはすべてのキューディレクトリを列挙する必要があり、「不必要に」複雑です。 。

2
Rui F Ribeiro