いますぐ実践! Linuxシステム管理

[バックナンバーのトップへ] [Linux システム管理のトップへ]


いますぐ実践! Linux システム管理 / Vol.070 / 読者数:876名

こんばんは、うすだです。

今日は、四日市の花火をみてきました。
知合いが四日市に住んでいて、家から花火がよくみえるというのを聞き、 一家でそのおうちにお邪魔してきた次第です。

ひさびさにみて思ったのですが、花火って、不思議ですよね。
大雑把に言ってしまえば、丸い玉に火薬を詰めただけなのに、 実に様々な色や形になります。 花火大会は1時間半ほどでしたが、ずっとみていても、 ぜんぜん飽きることなく楽しむことができました。

それから、視覚だけでなく、 聴覚(爆発(?)する音)や嗅覚(火薬の匂い)も楽しめるということに、 今日は気づきました。
こういうのって、知識だけではなかなか気づかないことですよね。 出不精なわたしも、たまにはお出かけして、体験しないといかんと思いました。

そんなわけで、いろいろ楽しかったのですが、帰りは渋滞で大変でした。
結局、わが家には、日付が変わる直前に、ようやくたどり着きました。

ちょっとげんなりしてますが、今週も、はりきってまいりましょう!

今週のお題 - メールサーバを監視する

というわけで、安直なテーマを選んでしまいました。

…あ、いや、でも、ほら、メールが届かなくなると、 困るひとがいっぱいいるわけですよね。 休み中だったから気づかなかったとか、外出して直帰したから知らないとか、 システム管理者は、そんな苦しい言い訳をしても聞いてもらえないわけですよ。

異常を即座に関知し、早急に修正する。
これでこそ、システム管理者の鏡だ!! と声高に言えることでしょう。

というわけで、今週は、メールサーバを監視する方法を、ご紹介します。


安直に、以下のように、Mail コマンドで確認する方法も、 ありといえばありだと思います。

  % echo test | /usr/bin/Mail -s test usu@usupi.org

usu@usupi.org に、test というメールが届けば大丈夫、という方法です。

しかし、複数のメールサーバで分散していると、どれかがとち狂っていても、 とち狂っているメールサーバを回避してうまく届いてしまう、 ということが考えられます。
(実際、わたしが使ってるプロバイダは、 2つあるメールサーバのうち1つがとち狂っていることに、 しばらく気づいていませんでした。)

ですので、今回は、メールサーバに直接 SMTP で接続して、 メールを送信することで、メールサーバを監視したいと思います。

しかしながら、今度ばかりは都合のいいコマンドが見当たりません。
ですので、困ったときの Perl さま! に頼りたいと思います。

うまい具合に、Perl には Net::SMTP というモジュールが存在しましたので、 これを使って、実現してみようと思います。
Net::SMTP モジュールは、最近のディストリビューションであれば、 標準で入っているはずです。(ちなみに、RedHat 7.2 にもありました。)

 

というわけで、やや試行錯誤して作ったスクリプトが、以下です。
引数にメールサーバと宛先アドレス、送信元アドレスを指定して実行すると、 そのメールサーバに直接 SMTP で接続して、メールを送信します。
ちょっと長いですが、ご辛抱ください。

  #!/usr/bin/perl
  use Net::SMTP;
  use strict;

  # (1)引数チェック
  if($#ARGV != 2) {
      print STDERR "Usage: $0 smtpserver to_addr from_addr\n";
      exit 1;
  }
  # (2)第1引数=メールサーバ, 第2引数=宛先, 第3引数=送信元アドレス
  my $host = shift;
  my $addr = shift;
  my $from = shift;

  # (3)接続して、送信元と宛先とメールの内容を伝える
  my $smtp = Net::SMTP->new($host);
  if(!$smtp) {
      &err_exit($smtp, "cannot connect to $host.", 2);
  }
  if(!$smtp->mail($from)) {
      &err_exit($smtp, "$from: MAIL FROM failed.", 3);
  }
  if(!$smtp->to($addr)) {
      &err_exit($smtp, "$addr: RCPT TO failed.", 4);
  }
  if(!$smtp->data()) {
      &err_exit($smtp, "DATA failed.", 5);
  }
  if(!$smtp->datasend("From: $from\nTo: $addr\n\ntest") ||
     !$smtp->dataend()) {
      &err_exit($smtp, "DATA failed.", 6);
  }
  $smtp->quit;
  0;

  # (4)失敗したときの後処理
  sub err_exit {
      my ($smtp, $msg, $stat) = @_;
      print STDERR "$msg\n";
      $smtp->quit if $smtp;
      exit $stat;
  }

大雑把に内容を説明しますと…
(1) で、引数の個数をチェックして、(2) で、引数を変数に代入します。
(3) では、実際にメールサーバへ SMTP で接続し、 適当な内容のメールを送ります。
(3) のどこかで失敗した場合は、(4) で、 エラーメッセージを出力しつつ後処理を行って、終了します。

(3) の一連の処理は、SMTP をご存知のかたなら、 なんとなくああこれをやってるんだな、と推測できると思います。
ご存知ないかたは、以下にヒントがちょろっと載っていますので、 よろしければご参照ください。

Vol.020 - telnet でメールのチェックをする
http://www.usupi.org/sysad/020.html

 

さて、このスクリプトを、たとえば、 /usr/local/sbin/smtpcheck.pl という名前で保存して、実行権をつけたら、 以下のように実行します。

  % /usr/local/sbin/smtpcheck.pl smtp.usupi.org usu@usupi.org \
  usu@usupi.org

smtp.usupi.org が正常に動作していれば、 usu@usupi.org に test とだけ書かれた無愛想なメールが届きます。
(上記の smtp.usupi.org や usu@usupi.org を、 ご使用の環境に置き換えて実行してみてください。以降も同様です。)


これを、先週と同様に、失敗したらメールするようにしてみます。

  % /usr/local/sbin/smtpcheck.pl smtp.usupi.org usu@usupi.org \
  usu@usupi.org || \
  (echo mail server is wrong | /usr/bin/Mail -s 'Alert' root)

これを実行すると、smtp.usupi.org がとち狂っていて、 usu@usupi.org にメールが出せないとき、root 宛にメールが届きます。
smtp.usupi.org が正常なら、 確認のメール(test とだけ書かれた無愛想なメール)が usu@usupi.org に届きます。

あとは、これを cron で定期的に実行すれば、 メールサーバの監視を行うことができると思います。
しかし、たとえば、上記を10分に1回実行しますと、1日に144通、 確認のメールが usu@usupi.org に送られてしまいます。

…それはちょっとうっとおしいですよね。 確認のメールは読む必要がないと思いますので、捨ててしまいます。
受信したメールをすべて捨ててしまうアドレスを作成し、 そのアドレスに確認メールを送るようにすれば、実現できますね。

ここでは、そのアドレスを check という名前にしたいと思います。
/etc/aliases に、以下のエントリを追加しましょう。

  check: /dev/null

追加したら、newaliases コマンドを実行します。
これで、check 宛に来たメールは、/dev/null に捨てられます。

あとは、確認メールの送り先を check に変えれば、完成です。

  % /usr/local/sbin/smtpcheck.pl smtp.usupi.org check@usupi.org \
  usu@usupi.org || \
  (echo mail server is wrong | /usr/bin/Mail -s 'Alert' root)

以上、メールサーバを監視する方法について、ご紹介しました。

しかし、まだ問題が残っています。
監視しているメールサーバと、 Mail コマンド経由でメールを送信したときに経由するメールサーバが同じ場合、 メールサーバがとち狂ったときに、通知メールが届かなくなってしまいます。

さてどうしましょう…?
ということで、続きは次週にご紹介したいと思います。

宿題の答え

先週の宿題は、

  Anonymous FTP サーバを監視してください。

でした。

先週のお題と同様、wget コマンドでできます。
監視用のファイルが、ftp://ftpserver/pub/keepalive.txt だとすると、 以下のように実行するだけです。

  % wget -q -O /dev/null ftp://ftpserver/pub/keepalive.txt || \
  (echo ftpd is down. | /usr/bin/Mail -s '[ftpd] Alert' root)

…これだけだとあまりにもアレですので、 wget のエラーメッセージを送信するようにしてみましょう。
こんなシェルスクリプトを作ってみました。

  #!/bin/sh
  TMPFILE=/tmp/ftpcheck-$$
  trap "rm -f $TMPFILE" 0 1 2 3 9 11 15
  LANG=C
  export LANG

  if [ $# -ne 2 ]; then
      echo "Usage: $0 url address"
      exit 1
  fi

  URL=$1
  MAIL=$2
  /usr/bin/wget -O /dev/null $URL > $TMPFILE 2>&1
  if [ $? -ne 0 ]; then
      /usr/bin/Mail -s '[wget] Alert' $MAIL < $TMPFILE
  fi

最初は、使用する一時ファイル(TMPFILE)と、 シグナルを受信したときに一時ファイルを消すための呪文(trap)、 環境変数 LANG の設定です。
次に、引数から、URL とメールアドレス(MAIL)を得ます。 なければ文句を言って強制終了します。

あとは、出力を一時ファイルにリダイレクトしつつ wget コマンドを実行して、 wget の終了ステータス($?)が 0 でなければ、一時ファイルの内容をメールします。

このシェルスクリプトを、 たとえば /usr/local/sbin/wgetchk.sh という名前で保存し、実行権をつけたら、

  % /usr/local/sbin/wgetchk.sh http://www.usupi.org/sysad/ root

とか、

  % /usr/local/sbin/wgetchk.sh ftp://ftpserver/keepalive.txt root

という具合に実行してください。
wget が正常終了しなければ、その実行結果が root にメールされます。

今週の宿題

今週の宿題は、

  今週のスクリプトを使ってメールサーバを監視しますが、メールサーバ
  がおかしいとき、エラーメッセージをメールで通知してください。

です。

今週のお題では、メールサーバがおかしいときにメールで通知しますが、 メッセージはいつも同じなので、なにがおかしいかがわかりません。
スクリプトのエラーメッセージをメールで通知すれば、 なにがおかしいかが推測できますよね。
前述の宿題の答えを参考にして、作ってみてください。

あとがき

先週くらいまで、「ハッカーと画家」を読んでいたのですが、その中に、 ベンチャー企業は、2つの選択肢があったら、技術的に難しいほうを選べばいい、 というような記述がありました。

技術的に難しければ難しいほど、同じ土俵にいる企業がいない (特に大企業は難しいほうを選べない)ため、有利になる、ということだそうです。

そして、人生においても、同じことが言えるとあります。
簡単なほうは、自分の怠惰さが持ち出してきたに違いなく、心の底では、 自分が何をすべきかわかっているはずだからだそうです。

言われてみればその通り、と言えそうですが、恥ずかしながらわたしは、 この本を読むまで気がつきませんでした。
実際に、難しいほうを選択できるかどうか自信はありませんが、 もしそういう状況になったら、一瞬でも考えてみようと思いました。

そして興味深いことに、岡本太郎も、同じようなことを言っていました。
「自分の中に毒を持て」の中で、安全な道と危険な道があったら、 危険な道を選ぶべきだ、と主張しています。
安全で間違いのない道を選ぶよりも、死に対面することこそ生なのでは、 というような厳しいことを、いつもの熱い文体で書かれています。

テンションとかニュアンスが違いますが、結果的に、 アメリカの技術屋と日本の芸術家が、同じことを主張しているのが、 面白いと思いました。

あ、いずれも、わたしのいい加減な要約ですので、詳しくは、 以下の本を読んでください。どちらも面白いので、読んで損はしないと思います。

ハッカーと画家
http://www.amazon.co.jp/exec/obidos/ASIN/4274065979/usupiorg-22

自分の中に毒を持て
http://www.amazon.co.jp/exec/obidos/ASIN/4413090101/usupiorg-22

 

今週も、ここまで読んでいただき、ありがとうございました。
それでは、また『来週』に、お会いしましょう!

 

「いますぐ実践! Linux システム管理」の解除は、以下からできます。
http://www.usupi.org/sysad/ (まぐまぐ ID:149633)

バックナンバーは、こちらにほぼ全部そろっています。
http://www.usupi.org/sysad/backno.html

「栗日記」−この時期アクセスが少ない…だからみてください。
http://www.usupi.org/kuri/ (まぐまぐ ID:126454)
http://usupi.seesaa.net/ (栗日記ブログ)
http://www.fumido.co.jp/kuriniki/ (栗日記ぎゃらりー)


[バックナンバーのトップへ] [Linux システム管理のトップへ]

トップ

バックナンバー
    [日付順] [目的別]

プロフィール

▼ リンク

独学Linux
Linuxデスクトップ環境に関する情報が満載です。 メルマガもありますよ。
Server World
CentOS 6をサーバとしたときの設定例が、これでもかというくらいたくさん載っています。 CentOS以外のディストリビューション(Fedora, Ubuntu)も充実しています。
LINUXで自宅サーバーを構築・導入(Fedora9)
Fedora9のインストールの仕方から管理方法まで、詳しく載っています。 SearchManには情報がもりだくさんです。
マロンくん.NET
〜サーバ管理者への道〜
Linuxをサーバとして使用するための、いろいろな設定方法が載っています。 マロンくんもかわいいです。 なんといっても、マロンくんという名前がいいですね!!
日経Linux
今や数少なくなってしまったLinuxの雑誌。ニュースやガイドもあります。
Linux Square − @IT
@ITが提供する、Linux の情報が満載。 載っていない設定方法はないんじゃないでしょうか。
gihyo.jp…技術評論社
Linuxに限らず様々な技術情報が満載のサイト。 SoftwareDesign誌も、 ソフトウェア技術者は必見です。
SourceForge.JP Magazine
Linux に限らず、オープンソース関連の記事が網羅されています。
ITmediaエンタープライズ:Linux Tips 一覧
Tips というより FAQ 集でしょうか。わからないことがあれば覗きましょう。
IBM developerWorks : Linux
開発者向けですが、勉強になりますよ。
Yahoo!ニュース - Linux
Yahoo!のLinuxに関するニュース一覧です。
栗日記
システム管理とかと全然関係ありませんが、毎日栗の絵を描いています。
システム管理につかれちゃったとき、癒されたいときに、ご覧ください。:-)
WEB RANKING - PC関連
ランキングに参加してみました。押してやってください。

▼ 作ってみました

Add to Google

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本