RHEL 5
저는 오래된 RHEL 5 시스템에서 실행되는 Perl 서비스 모니터링 스크립트(더 이상 회사에서 근무하지 않는 동료가 작성)를 사용하고 있습니다. 서비스가 다운되면 루트 사용자에게 이메일 경고를 보냅니다.
# 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(Mail Transfer Agent)의 일부인 메일 서비스(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
하고 보고합니다(로그 메시지당 이메일 하나를 보내는 일반적인 크론 스팸 대신 그룹화된 요약을 통해...).
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);