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

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


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

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

今週は、突然、別のプロジェクトのお手伝いをすることになり、 東京にてお手伝い作業をしております。(もうお手伝いの域を越えていますが…)

土日は名古屋に戻れるかと思っていたのですが、 ものすごいあやうい状況になってきて、帰るわけにもいかず、 ホテルと会社の間を往復するだけの日々が続いています。

会社に属する限り、仕方がないと言えば仕方がないですし、 途中でほうり出すのも人間として間違っていると思いますので、 もうちょっとがんばりたいと思います。

それはともかく、ひさびさに東京へ来て思ったのは、こんなことでした。

  • 信号が赤になってから、反対側が青になるまでの時間が、やけに短い。
  • 深夜もひとがそれなりにいて、店もけっこうやっている。
  • am/pm がやたら多い。通りをはさんで向かい合わせにあったりする。
  • コンビニの店員さんは、半分くらいが外国人のような気がする。
  • 東大にいたひとは、みんな東大にいるひとっぽく見えた。
  • ひとが歩いていない秋葉原の街を、はじめて見た。

…田舎もんのひとりごとみたいですね。というかそのものです。

おつかれ気味ですが、負けずに、今週も、はりきってまいりましょう!

今週のお題 - メールサーバを監視する / デッドマンズ・チェスト

先週、メールサーバを監視する方法を、ご紹介しました。

Vol.070 - メールサーバを監視する
http://www.usupi.org/sysad/070.html

メールサーバに SMTP でアクセスして動作確認を行い、 おかしかった場合にメールで通知する、という方法をご紹介しました。

しかしよく考えたら、監視を行っているマシンのメールサーバと、 実際にその環境で使用しているメールサーバが同じだったら、 メールが届かなくなってしまいます。

では、別のメールサーバに、 直接メールの送信をお願いしてしまえばよいのではないでしょうか。

というわけで、先週の続きです。


別のメールサーバに直接お願いする、ということは、 SMTP で直接アクセスするということです。

あ、じゃあ、先週ご紹介した、smtpcheck.pl がそのまま使えそうです。

smtpcheck.pl は、メールサーバと、 宛先および送信元のメールアドレスを引数に指定すると、 そのメールサーバに対して、SMTP を使って、 test と書かれた味もそっけもないメールを送信します。

  % /usr/local/sbin/smtpcheck.pl smtp_server test usu@usupi.org \
  || echo NG

上記のように実行すると、smtp_server に対して、test 宛にメールを送信します。 失敗すると 0 以外の値を返すため、NG と出力されます。

それでは、以下のようにしてみると、どうでしょうか。

  % /usr/local/sbin/smtpcheck.pl bad_server test usu@usupi.org \
  || /usr/local/sbin/smtpcheck.pl good_server root usu@usupi.org

bad_server がおかしくなっていたら、good_server 経由で、 test という内容のそっけないメールが、root に送信されるようになります。


しかし、いくらなんでも、test では困りますよね。
smtpcheck.pl が送信するメールの、 サブジェクトと本文を指定できるようにしてみましょう。

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

  # (1)引数チェック
  if($#ARGV != 3) {
      print STDERR "Usage: $0 smtpserver to_addr from_addr subject\n";
      exit 1;
  }

  # (2)第1引数=サーバ, 第2引数=宛先, 第3引数=送信元, 第4引数=題名
  my $host = shift;
  my $addr = shift;
  my $from = shift;
  my $subj = shift;  # (5)サブジェクト

  # (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\nSubject: $subj\n\n")) {
      &err_exit($smtp, "DATA failed.", 6);
  }
  while(<>) { # (6)標準入力をそのまま本文に
      if(!$smtp->datasend($_)) {
          &err_exit($smtp, "DATA failed.", 6);
      }
  }
  if(!$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)〜(4) の大枠の流れは、基本的に同じです。
今回ちょっと違うのは、(5) のサブジェクトと、(6) の本文です。
引数を1つ増やし、それをサブジェクトに使用します。
そして、データを送信する際に、標準入力から読み込んだ文字列を、 そのまま本文として送信しています。

ですので、先ほどの実行を、以下のように変えれば、 ちゃんとした警告のメールが送られるようになります。

  % echo test | smtpcheck.pl bad_server test usu@usupi.org "" \
  || (echo "bad_server is bad" | \
      smtpcheck.pl good_server root usu@usupi.org Alert)

以上、メールサーバを監視する方法…の続きを、ご紹介しました。

トラブルには、さまざまなものがあると思います。
これでおっけー、ということはまずありませんので、問題にぶちあたったとき、 柔軟に対応できるよう、日頃からの鍛錬が重要だと思います。

…というのは、今の自分に言い聞かせたい言葉でした。

宿題の答え

先週の宿題は、

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

でした。

前回と同様、標準エラー出力を一旦ファイルに記録しておいて、異常終了時に、 記録しておいたファイルの内容を、メールで送信すればいいですね。
というわけで、今週のスクリプトを利用した、シェルスクリプトです。

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

  if [ $# -ne 5 ]; then
      echo "Usage: $0 check_serv check_to failsafe_serv alert_to from"
      exit 1
  fi

  CHECK_SERV=$1
  CHECK_TO=$2
  OK_SERV=$3
  SEND_TO=$4
  FROM=$5
  SUBJECT="[Alert] $CHECK_SERV"
 
  echo test | smtpcheck.pl $CHECK_SERV $CHECK_TO $FROM test > \
      $TMPFILE 2>&1
  if [ $? -ne 0 ]; then
      cat $TMPFILE | smtpcheck.pl $OK_SERV $SEND_TO $FROM "$SUBJECT"
  fi

基本的には前回の宿題と同様ですので、説明は割愛させていただきます。
smtpcheck.pl のパスは、本当は正確に書いたほうがいいなど、 いろいろと突っ込みどころがあると思います。 みなさんでお探しください。(投げ槍)

今週の宿題

今週の宿題は、

  インターネットでのメールの配送方法を調べましょう。

です。

ようは、DNS のなにを引いて、誰に送るか、というあたりのことです。
基本的なことですし、みなさんはご存知かもしれませんが、おさらいだと思って、 調べておいてくださいませ。

あとがき

というわけで、フル回転で作業をしてますが、 インストールスクリプトを作成して試している最中、 思わぬ罠に引っかかってしまいました。

なんと、サーバの /bin が、まるっとごっそり消えてしまったのです。
つまり、たとえば、ls を実行したら、 command not found とか言われてしまったわけです。 (全身の毛穴から、冷汗が放出されました。)

同じ OS の別のマシンに HDD をつなぎ、/bin をコピーすることで、 復旧はできたのですが、原因がわかりません。

とはいえ、また /bin が消えてはいけませんので、 また同じことになっても復旧できるよう、以下を実行しておきました。

  # cd /
  # tar cf some/where/bin-all.tar bin
  # cp -p bin/tar some/where/

つまり、もし /bin がなくなっても、以下のようにすれば、 最悪の自体を避けることができます。

  # cd /
  # ./some/where/tar xfp some/where/bin-all.tar

 

それはさておき、びくびくしながら作業をしているうちに、 原因を見つけることができました。
Makefile に、以下のような記述がありました。

  uninstall:
          @rm -rf $(PREFIX_BIN)/bin

一見、なんの問題もないように見えますが、 もし $(PREFIX_BIN) が定義されていないと… うあああ、ということでした。

みなさんも、rm を使うときには、十分注意しましょう。
いやー、日々勉強ですね。
経験値を稼げたなーと、前向きに考えることにしたいと思います。

 

という状況ですので、申し訳ありませんが、来週はお休みをいただきたいと思います。

 

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

 

「いますぐ実践! 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

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本