メールサーバのキューがあふれたら・・・

検索用ワード: var/spool/postfix/incoming postfix /var Diskfull キュー いっぱい 削除

大量にメールが来て、メールサーバのHDDがいっぱいになってしまったのでキューをなんとかしたいとき。
要約すると以下の手順が有効。

キューの一覧表示

#mailq

postfixが止まっている場合はroot以外で行えないため注意。
基本的にはファイルに落としてsort uniq grep awkなど駆使して原因を究明する。
原因がわかったら問題となっているメール群を消す。
(今回見たく)ループならループを起こしているメールアドレスとか、backscatterならDAEMONからのエラーメールとか...
キューの削除は

# postsuper -d QUEUE_ID

だが、mailqの出力をそのまま食わせてもだめ。
mailqの出力の第1要素をうまく抽出して

# cat mailq.log|FILTER COMMAND|postsuper -d -

見たくやる。
一例を示すと

mailqの出力をファイルに落とす
# mailq > mailq.log
メールアドレス foo@example.comからのメールを消したい
# cat mailq.log|grep foo@example.com$|awk '{print $1}'|postsuper -d -
DAEMONからのメールを消したい
# cat mailq.log|grep MAILER-DAEMON$|awk '{print $1}'|postsuper -d -

ただし、mailqの出力は

-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
XXXXXXXXXX 112 Thu Dec 11 hh:mm:ss foo@example.org
bar@example.net

となっているため、受信者アドレスの行をうまく排除する必要がある。
自分の場合は

# cat mailq.log|grep foo@example.com$|grep Dec|awk '{print $1}'|postsuper -d -

とすることで日付部分をキーにキューIDのある行を抽出した。(これが最良かどうかは不明。臨機応変に)
もちろん、トラブルが10月に起きたら grep Dec は grep Oct にする。
この辺は各自のセンスと好みでうまくやるしかない。

なお、暫定的にキューを空にして早期復旧を目指す場合は

# postsuper -h ALL

なんて手段もある。
これは hold キューに既存のキューを退避させる方法。
これでincomingキューを空にしてやればとりあえずそれ以降のメールは正常に処理してもらえる。
ただし筆者は試していないので詳細は不明。