分类: 系统运维
2011-11-16 12:00:01
sendmail兼容的命令行工具
1. mailq 对邮件队列文件进行列表。表中的每一个条目包含有以下信息: 队列文件ID、邮件的大小、到达的时间、发件人、收件人和投递延迟的原因(如果投递有延迟的话)。该命令主要是与showq后台程序来获取队列文件的相关信息。该命令无参数。
2. newaliases 该工具进行别名数据库的初始化。如果没有指定数据库的类型,则使用系统默认的数据库类型(在linux下为hash)。该命令可以不带参数执行。
1. postcat 打印邮件队列文件的内容。后面界要显示的队列文件名,可以带一个-v的参数进行冗余显示。
2. postconf 打印配置参数设置后的值或postfix的其他信息。 -d 打印配置参数的缺省值。 -m 列出所有支持的查询表类型,不带参数则打印配置参数设置后的值。
3. postmap 建立postfix查询数据库。在linux下可以直接跟上原始文件而不带任何参数来建立该数据库。
4.postalias 创建或查询别名数据库。
5.postdrop 将邮件放回到maildrop/目录,由postfix重新进行投递操作。
6.postfix 启动或停止postfix系统,或重新读取配置文件。也可以用于其他维护工作,包括检查系统配置,以及清空队列。
7.postkick 对特定postfix服务发出请求。此工具的作用,主要是给shell scripts提供一个能够与postfix沟通服务的管道。
8.postlock 锁定特定文件,确保能够独占访问。此工具的作用,主要是让shell scripts能使用兼容于postfix的锁定方式。
9.postlog 将指定的信息记录到系统日志文件中。这是支持shell scripts工具,使其能以类似于postfix的样式来记录信息到日志文件。
10.postmap.创建查询表的DB数据库或查询查询表内容。postfix有许多配置信息都是记录在postmap所建的查询表数据库中。
11.postqueue让一般用户能够有限度的访问postfix队列。可能改变队列的访问方式需要有管理员特权才能进行,而这方面的访问能力由postsuper命令提供。 postqueue -p 显示信件队列 postqueue -f 全部扫清队列
12.postsuper 供管理员访问postfix队列。管理员可删除邮件、扣留邮件(搬到hold队列)、取回邮件(将邮件从hold队列搬回active队列),必要时,还可以修复队列目录结构。 postsuper -d Queue_ID 删除个别队列 postsuper -d ALL 删除全部队列 postsuper -h Queue_ID 扣住信件 postsuper -H Queue_ID 回复信件 postsuper -r Queue_ID 重进排队 postsuper -r ALL 重进排队
清理队列
今天有同事反映发邮件速度慢,登录了邮件服务器的后台看一下(我们的邮件服务器是postfix+dovecot+mysql+extmail+extman
搭建的基于mysql的虚拟用户),队列已经达到8万多
邮件队列已经达到了80000封,然后我看了一下负载,已经达到20多了…….
大家都清楚负载一旦达到这个数值,服务器的性能肯定已经相当差了。这里就有问题了,队列这么多如何清理呢?
如果是把队列全部清除的话很简单:postsuper –d ALL 就ok了。但是这样操作会产生很多问题,有的正常的还没有发送的队列也会被清掉;
假如一个一个的清理,那太要命了,怎么办呢?我用postqueue –p查看了一下,发现队列里的日期的两个特点,一是日期排列不规律,
第二个特点是日期只有最近5天的。Ok,有办法了。
这是我写的一个脚本:
#!/bin/bash
/usr/sbin/postqueue -p|egrep '(Nov 8|Nov 9)' > queue1.txt
/usr/sbin/postqueue -p|egrep '(Nov 8|Nov 9)'|awk '{print $1}' > queue2.txt
for i in `cat /root/queue2.txt`
do
/usr/sbin/postsuper -d $i
done
这个脚本的作用是把队列当中日期为8号和9号的的队列写到一个文件queue1.txt(包含日期等信息),queue2.txt(只包含队列号);
然后用一个for循环来把queue2.txt里面的所有的队列都清除掉。执行完脚本,过几分钟再看队列已经不到1万了(最近两天的队列没有清除)
Ok,队列少了很多,而且服务器的负载也已经小于5了。
看被Queue的信:
postqueue -q (我都是用這個)
or
mailq
強迫將Queue信寄出:
postqueue -f
刪除所有被Queue的信:
postsuper -d ALL
刪除某封Queue的信:
先用postqueue -q or mailq
查queue_id
postsuper -d queue_id
刪除所有正在 deferred 佇列中的郵件 ( 刪除曾經發送失敗的信 ):
postsuper -d ALL deferred
刪除所有正在 deferred 佇列中的郵件 ( 可看出哪些信被刪除了 ):
find /var/spool/postfix/deferred -type f -exec rm -vf {} ;
刪掉「三天以前」無法發出的郵件:
find /var/spool/postfix/deferred -type f -mtime +3 -exec rm -f {} ;
列出目前所有無法發出的郵件:
find /var/spool/postfix/deferred -type f -exec ls -l --time-style=+%Y-%m-%d_%H:%M:%S {} ;
刪除超過 5 天的 "defer" 佇列中的退信紀錄:
find /var/spool/postfix/defer -type f -mtime +5 -exec rm -f {} ;