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

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


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

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

24時間フル愛用している ThinkPad の、ハードディスクの具合がおかしくなりました。

いちおう動作はしているようですが、アクセス時間が異様にかかります。
dmesg コマンドの出力を見ると、こんなのが出力されていました。

  hda: dma_timer_expiry: dma status == 0x01
  hda: error waiting for DMA
  hda: dma timeout retry: status=0xd0 { Busy }
  hda: DMA disabled
  ide0: reset: success

はるか以前、別の PC の調子がおかしくなったときに、見た気がします。
耳をすましてみると、ときどき「うおーん」とおっしゃいます。
ハードディスクの崩壊が、近付いているのかもしれません。

トラブルは、いつも突然やってくるものですが、こんなふうに、 そろそろかもよって教えてくれるのは、ありがたいことだと思いました。

…なにごとも、前向きにとらえていきたいと思います。

それでは、今週も、はりきってまいりましょう!

今週のお題 - メールを集計する

先週の最後で、Apache ネタを…とか言いましたが、 ぱっと思いつきませんでしたので、昔よくやったアレで行きたいと思います。

よく、WWW 上でアンケートや問い合わせのフォームを用意し、 結果を CGI でメールする、というようなことをします。よね。

たとえば、フォームに入力してボタンを押すと、以下の CGI が起動されるとします。 (日本語の処理やエラー処理などは、割愛しております。)

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

  my $cgi = new CGI;
  my $vote = $cgi->param('vote');
  my $name = $cgi->param('name');
  my $mail = $cgi->param('mail');
  my $smtp = Net::SMTP->new('localhost');
  $smtp->mail('usu@usupi.org');
  $smtp->to('vote@usupi.org');
  $smtp->data;
  $smtp->datasend("To: vote\@usupi.org\nFrom: usu\@usupi.org\n");
  $smtp->datasend("Subject: [result] vote\n\n");
  $smtp->datasend("Vote = $vote\nName = $name\nMail = $mail\n");
  $smtp->dataend();
  $smtp->quit;
  print $cgi->redirect('thanks.html');

フォームで入力された vote, name と mail を、 Net::SMTP パッケージを使ってメールするだけの、簡単な CGI です。
この CGI が起動されると、以下のようなメールが、 集計専用のアドレス vote@usupi.org 宛に送られます。 (そして、thanks.html に飛びます。)

  To: vote@usupi.org
  From: usu@usupi.org
  Subject: [result] vote

  Vote = Good
  Name = 栗描いてるひと
  Mail = kuri@usupi.org

これを集計するわけですが、いちいち手で処理していては、 いくら時間があっても足りませんよね。

というわけで、今週は、CGI などから送られてきた、ある決まった形式のメールを、 集計してみたいと思います。

それってシステム管理じゃないよねとか、うちはデータベースに記録してます、 というような上級者の方にとっては、物足りない内容となっております。 申し訳ありませんが、宿題までスルーしてください。

さて、まずは、vote から処理してみましょう。
これは、"Good" か "Bad" のいずれかの文字列で、それぞれの数を求める必要がある、 ということにします。

集計する Perl スクリプトの例は、以下のようになります。

  #!/usr/bin/perl
  my %sum;
  while(<>) {
      chop;
      if(/^Vote\s*=\s*(\S+)/) {
          if($1 eq "Good" || $1 eq "Bad") {
              $sum{$1}++;
          } else {
              $sum{'Other'}++;
          }
      }
  }
  print "Good:  $sum{'Good'}\nBad:   $sum{'Bad'}\n";
  print "Other: $sum{'Other'}\n";

標準入力から読み込んだものが "Vote = " で始まる行だった場合、 その後に続く文字列を、連想配列 %sum に集計しています。
そして最後に、集計結果を、標準出力に出力します。

このスクリプトのファイル名が votesum.pl だとして、 メールスプールを直接処理するときは、以下のように実行します。
(そのひとの権限か、root の権限で実行しましょう。)

[実行]   <--- 押してね
 
#

それぞれのメールが、 どこかのディレクトリ(以下では vote_dir)に格納されている場合は、 以下のように実行します。

[実行]   <--- 押してね
 
%

では、次に、name と mail も合わせて処理してみましょう。
こちらは、集計するわけにはいきませんので、 CSV 形式で出力するものにしてみたいと思います。
早速ですが、スクリプトの例を、以下に示します。

  #!/usr/bin/perl
  my (%sum, @dat);
  while(<>) {
      chop;
      if(/^Vote\s*=\s*(\S+)/) {
          print "\"$dat[0]\",\"$dat[1]\",\"$dat[2]\"\n" if $dat[0];
          $dat[0] = $1;
          if($1 eq "Good" || $1 eq "Bad") {
              $sum{$1}++;
          } else {
              $sum{'Other'}++;
          }
      } elsif(/^Name\s*=\s*(.*)$/) {
          $dat[1] = $1;
      } elsif(/^Mail\s*=\s*(.*)$/) {
          $dat[2] = $1;
      }
  }
  print "\"$dat[0]\",\"$dat[1]\",\"$dat[2]\"\n" if $dat[0];
  print STDERR "Good:  $sum{'Good'}\nBad:   $sum{'Bad'}\n";
  print STDERR "Other: $sum{'Other'}\n";

標準入力からひたすら読むところ、vote を %sum で集計するところは、 先ほどと同様です。
そのときの vote, name および mail の内容を、 それぞれ $dat[0〜2] に格納します。
そして、"Vote = " を発見したときと最後のときに、標準出力に出力しています。
また、vote の集計結果は、標準エラー出力に出力しました。

[実行]   <--- 押してね
 
#

ただし、メールの場合、ISO-2022-JP という文字コードになっていますので、 Windows で扱うには、Shift-JIS などに変換する必要があります。

  # iconv -f ISO-2022-JP -t Shift-JIS result.csv > result-s.csv

処理するときに、以下のように、直接変換した方が楽かもですね。

  # ./votesum.pl < /var/spool/mail/vote | \
  iconv -f ISO-2022-JP -t Shift-JIS > result.csv

というわけで、ほぼスクリプトの話でしたが、いかがでしたでしょうか。
そんなの知ってるからとか、どうやって応用するんだよ、とかでしたら、 申し訳ありません。
もし万が一、評判が悪くなければ、せっぱつまったときに、 こんな感じのネタをまた取り上げてみたいと思います。

宿題の答え

先週の宿題は、

  sudo コマンド実行時に、リダイレクトしたファイルは、誰の持ち物に
  なるでしょうか?

でした。

やってみれば一目瞭然ですので、やってみましょう。
usu ユーザで、以下を実行しますと…

[実行]   <--- 押してね
 
%

残念ながら、root の持ち物にはなりません。
リダイレクトは、sudo ではなく、sudo を実行するシェルが行うからですね。 root の所有物にしたい場合は、以下のようにする必要があります。

  % sudo sh -c "cat /var/log/messages > /tmp/messages"

今週の宿題

今週の宿題は、

  今週のお題で作成したスクリプトを、もう少し柔軟にしてください。

です。

簡略化のため、決まった形式であることを前提としていましたが、 実際にはそうでないこともあるかもしれません。
たとえば、空白の数に関係なく処理できるようにするとか、 大文字小文字の区別をしないようにすることで、 ある程度柔軟なものに仕上げることができるのではないかと思います。 (ロバストっていうんでしょうか。)

明確な答があるわけではありませんので、ご自由にお考えください。

あとがき

冒頭で、ThinkPad のハードディスクが、なんとか動いてますと書きましたが、 その後1時間もたたないうちに、お亡くなりになられました。

しかし、日頃から、以下の方法でバックアップや同期をとっていたため、 大事なものは失わずにすみました。

Vol.001〜003 - 簡易バックアップ 3部作
http://www.usupi.org/sysad/001.html
http://www.usupi.org/sysad/002.html
http://www.usupi.org/sysad/003.html
Vol.009 - 別のマシンにあるディレクトリと同期をとる
http://www.usupi.org/sysad/009.html

メルマガのネタだけじゃなく、実際にやっててよかったと思いました。
備えあればうれいなしですので、みなさんも、読むだけでおわらせずに、 やってみてください。もしものときにほっとしますよ。(宣伝!宣伝!)

しかし、大事なものは無事復旧できましたが、音楽データなどの趣味的なものは、 ごっそり失いました。

最近、「7つの習慣」や「地上最強の商人」を読んで、 よい習慣を行うことの重要性に気づき始めていたところでした。
きっと神様が、今までの欲望を捨てて、もっと役立つことをやりなさい、 というきっかけを与えてくれたのだと思うことにします。

…なにごとも、前向きにとらえていきたいと思います。

さて、あと1週間で、黄金週間ですね。
来週は、このメルマガもお休みをいただこうと思います。
休みを満喫…というわけではなくて、ただ単に本業がせっぱつまっているだけです。 (これを書いている最中も、ちょっと焦っております。)

今週も、ここまで読んでいただき、ありがとうございました。
よい黄金週間を、お過ごしください。
それでは、次回は 5/7 に、お会いしましょう!

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


[バックナンバーのトップへ] [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

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本