web-dev-qa-db-ja.com

sendmailキュー-ドメインごとのメッセージ数を表示します

Linuxのsendmailキュー内のドメインごとの現在のメッセージ数を確認する簡単なコマンドはありますか? mailqは詳細なリストをダンプしますが、簡単な概要を把握するには便利ではありません。

Centosとsendmailを使用しています。

mailq -v | egrep -v '^-' | get_domains.pl | sort | uniq -c
But the above command output is as following:
1 domain.com>

上記のコマンドは私の要件を満たしていませんでした。この点に関するヘルプをお願いします。

更新された出力は次のとおりです。

domain.com> has 5 message(s)
domain.com.pk> has 1 message(s)
abc.com.pk> has 2 message(s)
xyz.coinfo.net.cn> has 1 message(s)
mmm.com> has 1 message(s)
4
User4283

ええと、もしあなたがPerlを使うつもりなら、ずっとうまくいくかもしれません。

以下は、ドメインごとのメッセージ数を数えるかなり不完全な方法です。

#!/usr/bin/Perl

use strict;

my @mailq = `cat /home/users/rilindo/mailq`; #Had to simulate the output of the mail command here. Change this to the actual mailq path, e.g. /usr/bin/mailq
my %domains = ();

foreach my $m (@mailq) {
    $m =~ s/^\s+//;
    $m =~ s/\s+$//;
    $m =~ s/>//;
    next if $m =~ /Queue/;
    if ($m =~ /\d\d:\d\d:\d\d/) {
        $domains{(split(/@/,$m))[1]}++;
    }
    else {
        $domains{(split(/@/,$m))[1]}++;
    }
}

foreach my $d (keys %domains) {
    print $d . " has $domains{$d} message(s)" . "\n";
}

基本的に、mailqコマンドの出力を配列に送信して繰り返します。配列内のレコードごとに、先頭と末尾のスペース/改行を削除してから、「@」記号で分割します。次に、ドメインをキーとして挿入し(存在しない場合)、ハッシュでインクリメントします。次の試行では、同じドメインが見つかった場合、値が単純にインクリメントされます。そこから、ハッシュをループして、一致の総数を含むドメインを出力します。

結果:

[rilindo@localhost ~]$ ./parsemail.pl 
domain.com has 6 message(s)
domain3.com has 2 message(s)
domain1.com has 2 message(s)

私が言ったように、それは完璧ではありませんが、それは仕事をします。他に何もないとしても、それはあなたにここからどこへ行くべきかについての考えを与えるでしょう。

ちなみに、あなたはPerlを知っているように見えるので、Perlのハッシュデータ構造のレビューは非常に役立つことがわかります。

http://www.cs.mcgill.ca/~abatko/computers/programming/Perl/howto/hash/

または:

http://perldoc.Perl.org/perldsc.html

2
Rilindo

これを試して:

# mailq -v | awk 'BEGIN { FS = "@" } \
!/^[a-zA-Z0-9-]|^[ \t]+(\(|\/|Total requests:)/ { print $2 }' | sort | uniq -c
3
quanta

「シンプル」は相対的です。 mailqの出力は解析するのが大変な苦痛ですが、それは可能です。典型的なmailq冗長出力は次のようなものです。

-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
637F5CFF9C*    1497 Sat Dec 18 21:40:34  [email protected] 
                                         [email protected]

637F5CFF9d*    1497 Sat Dec 18 21:40:35  [email protected] 
                                         [email protected]

いくつかの創造的なハッカーはあなたが必要なものを手に入れることができます:

まず、そのトップラインを取り除きたいと思います。これは人間にとっては有用ですが、構文解析の目標とは関係ありません。
最も簡単な方法:mailq -v | egrep -v '^-'

次に、受信者情報を取得してドメイン名を抽出します。 Perlはここであなたの友達です-この便利なスクリプトを通して出力をパイプします(それをget_domains.plと呼びましょう):

#!/usr/bin/Perl
$/ = "\n\n";                                    # Use a blank line as the separator.
while (<>) {
        ($x,$recip) = split(/\n/, $_);          # Extract the recipient line
        ($user,$domain) = split(/@/, $recip);   # Get the domain.
        print "$domain\n";                      # Print Recipient Domain
}

これは簡単な部分を残すだけです-ドメインを数えます(sort | uniq -cをパイプでつなぎます)。

したがって、mailq -v | egrep -v '^-' | get_domains.pl | sort | uniq -cは次のような出力を提供します。

    1 domain.com
    1 domain2.com
1
voretaq7