RHEL 5
私は古いRHEL 5システムで実行されているPerlサービス監視スクリプト(会社で働いていない同僚が書いた)を使用しています。サービスがダウンすると、root ユーザーに電子メール警告を送信します。
# Email administrator
if ($retval == 0 && $config{'MAX_EMAILS'} > 0) {
$service_restarts{$service} = 0;
system("echo \"This notification was generated because $service was down and has been successfully restarted.\"
| /bin/mail -s \"Monitor: $service restarted ($date)\" root");
}
私は/etc/aliases
以下を持っています:
root: [email protected]
私の質問は、ルートに送信されたメールを外部エイリアスとして転送するためにどのサービスを実行する必要がありますか?これらのサービスが中断された場合、まだ/usr/bin/mail
キューがありますか?
答え1
mail
とても愚かなことです。通常、メッセージをsendmail
バイナリに転送するだけです。残念ながら、さまざまな実装方法があるため、mail
使用している正確なバージョンに対してどのようなエラー処理が行われているかを確認するには、ドキュメントまたはコードを確認するのが理想的です。
メール転送エージェント(MTA)の一部であるメールサービス(RHEL5ではSendmailまたはPostfixの可能性が高い)に加えて、DNSも必要になる場合があります。 MTAがメールを送信するsendmail
にはDNSルックアップを実行する必要があるためです。fooexample.blah
一時的なエラーが発生し、電子メールがMTAキューディレクトリのどこかにある場合でも、MTAキューランナーが存在する可能性があります(RHEL MTAにはデフォルトでこれらのキューランナーが含まれています)。ああ、ファイルシステムが/var
いっぱいになると、MTAは追加のメールをキューに入れることができないため、メールを受け入れることができない可能性がありますmail
。 (特に、他のエラーのためにアラームシステムがいっぱいになり、より多くの/var
アラームを生成してから再び発生した場合は、ポケットベル会社に電話する必要があります。これは、ポケットベルが数え切れないほど多くのアラームを受信したため、ポケットベルを無効にしたためです。お見逃しなく。
...そしてサービスを定義したい範囲に応じて、ビジネスネットワークもあります。オプションですが、一般的なスパム対策サービスもあります。 Gmail または Exchange で通知をスパムとして拒否または削除するとどうなりますか?
また、呼び出しにはエラーチェックがありませんsystem
。mail
(またはfork
)exec
呼び出しが失敗する可能性があり、その後はどうなりますか?より合理的なアプローチは、これらの失敗をどこかに記録することです。
use Sys::Syslog;
openlog("homegrown-monitoring-101", "ndelay", "user");
system("echo ... root") == 0
or syslog(LOG_ERR, "non-zero exit code from mail command");
それなら理想的にはそれはまるでsec.pl
ログを確認しhomegrown-monitoring-101
て報告します(ログメッセージごとに1つの電子メールを送信する一般的なクローンスパムの代わりにグループ化された概要を介して...)。
mail
あるいは、MTAがdead.letter
ファイルをどこかに残すことができ(必要な場所に書き込むことができると仮定)、理論的には監視を介してそのファイルを確認できますが、新しい警告があり、警告が電子dead.letter
メールで送信される場合は、エラーを報告するための追加のプロトコルが必要になる可能性があります。あります。この場合。
centos 7システムでは、代わりにこのperl-Email-Sender
パッケージを使用してmail
メッセージの場所を渡します。
#!/usr/bin/perl
use 5.16.0;
use warnings;
use Email::Sender::Simple qw(sendmail);
use Email::Simple;
use Email::Simple::Creator;
...
my $message = ...;
my $email = Email::Simple->create(
header => [
To => $username . '@example.edu',
From => '[email protected]',
Subject => "...",
],
body => $message,
);
sendmail($email);