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

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


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

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

3年ぶりに、携帯を新しくしました。

3年も経つと、ユーザインタフェースも含めて、携帯の機能が、 結構違うことにビックリしました。しばらくは、いじくって遊べそうです。

…と思っていましたが、数日経っても、 3年前の機種と同程度の機能しか使っていません。 ひょっとして、充電池を交換すれば済んだんじゃない? という気がしなくもありません。(もう売ってないでしょうけど。)

ちなみに、けっこう人気機種だったのにもかかわらず、ポイントを使ったところ、 1銭も払わずにすみました。なんだか申し訳ないです。
(ちなみに、MEDIA SKIN ってやつです。オレンジ色が派手です…。)

ま、来週までに、ワンセグくらいは見ておこうかな、と思います。
時代についていけてませんが、今週も、はりきってまいりましょう!

今週のお題 - make を使って処理を簡略化する

システム管理を生業としていますと、ユーザを追加したり、 メールの設定を変更したり、といった作業が、頻繁に発生します。

設定ファイルを書き換えるだけならいいのですが、書き換えた後に変換が必要だったり、 変更したことをシグナルなどで通知する必要があったり、 はたまたそれらを組み合わせて行う必要があったりなど、 複雑怪奇な操作を強いられることがあります。

新米の頃ですと、手順書を見ながら逐一行ったりもしますが、 慣れというのはこわいもので、わかっているつもりで作業すると、 うっかり操作をし忘れてしまうことが、あるのではないかと思います。

うっかりを起こしてしまってからの後処理ほど、たいへんで惨めなものは ありません。そうならないためにも、日頃から、 うっかりしないよう予防策を練る必要があると思います。

というわけで今週は、make を使って、一連の処理を簡略化することで、 うっかりミスを少なくしてみたいと思います。


さて、make といえば、 それなり以上の規模のプログラム開発に必要となるユーティリティとして、 ご存知のかたも多いのではないかと思います。

ここはまず、make について、きちんと説明をしたいところなのですが、 それをしますと、今週のお題が膨大になってしまいますし、それ以前に、 わたしのニホンゴの技術では、記述することがはばかられます。
ですので、そのあたりは Google 様に聞いていただくとして、ここでは、 簡単な使い方をご紹介したいと思います。

make を使うのに必要なものは、Makefile というファイルです。
Makefile には、以下のルールを、ひたすら書きます。

  ターゲット: 必要なターゲット...
      コマンド...

ターゲットは、作成したいファイルか、処理の名前です。
必要なターゲットは、ターゲットを作成するために必要となる、 ファイルか処理の名前です。これらを生成するために処理が必要な場合は、 別の行でターゲットとして記述されることになります。
コマンドは、ターゲットを生成するのに必要となる、具体的な処理です。
コマンドの行の先頭が空欄になっていますが、ここには必ず TAB を入れてください。 (スペースだと、make の実行時に叱られます。)

Makefile を作成したら、make コマンドを実行します。
引数なしで実行すると、最初のターゲットを生成するための処理を実行します。 それが困る場合は、引数にターゲットを指定しましょう。

  % make ターゲット

make の使い方の説明になっていない気がしますが、そんな気持ちは払拭して、 早速、使用例をご紹介していきましょう。

まずは、postfix です。
まあ、postfix に限らず、aliases ファイルを更新した場合、 newaliases コマンドを実行する必要がありますよね。
ではまず、以下の Makefile を作成してください。
(newaliases の前の空白は、スペースではなく TAB です。念のため。)

  aliases.db: aliases
          newaliases

Makefile は、postfix なら /etc/postfix に作成してください。
そして、aliases を変更して make コマンドを実行しますと…

  # cd /etc/postfix
  # ls -l aliases*
  -rw-r--r-- 1 root root   522  4月 8日 23:27 aliases
  -rw-r--r-- 1 root root 12288  4月 7日 11:52 aliases.db
  # make
  newaliases
  # ls -l aliases*
  -rw-r--r-- 1 root root   522  4月 8日 23:27 aliases
  -rw-r--r-- 1 root root 12288  4月 8日 23:27 aliases.db

newalises が実行されて、aliases.db が更新されました。
ちなみに、もう一度 make を実行しますと…

  # make
  make: `aliases.db' は更新済みです

とおっしゃって、newaliases は実行されません。

make さんのエライところは、タイムスタンプを比較し、 必要なターゲット(aliases)のほうが新しいときにだけ、 コマンド(newaliases)を実行してくれるところです。
更新したときにだけ実行してくれますので、必要のない処理を省くことができます。 エコロジーですね。地球温暖化も食い止められそうです。

 

…では、応用編です。以下の Makefile を作成しましょう。
(newaliases と postmap, @ls の前の空白は TAB ですよ。念のため。)

  TARGETS = aliases.db transport.db virtual.db

  all: $(TARGETS)
  aliases.db: aliases
          newaliases
  transport.db: transport
          postmap transport
  virtual.db: virtual
          postmap virtual
  show:
          @ls -l $(TARGETS)

この Makefile は、 aliases.db, transport.db と virtual.db を作成するためのものです。 (TARGETS というマクロでひとまとめにしました。)
aliases, transport か virtual ファイルを変更してから make コマンドを実行すると、 それぞれを生成するコマンドを実行してくれます。
(以下は、3つとも更新したときの出力例です。)

  # make
  newaliases
  postmap transport
  postmap virtual

つまり、最初のターゲットである all を実行します。
ターゲット all を遂行するには、マクロ TARGETS …つまり aliases.db, transport.db と virtual.db を必要としますので、 これらを生成するためのコマンドを、再帰的にたどって実行してくれます。

ちなみに、更新する必要がなければ、以下のようにおっしゃいます。

  # make
  make: `all' に対して行うべき事はありません。

また、make の実行時に show というターゲットを指定すると、 それぞれのファイルの状態を、ls コマンドの実行により確認できます。

  # make show
  -rw-r--r-- 1 root root 12288  4月 8日 23:37 aliases.db
  -rw-r--r-- 1 root root 12288  4月 8日 23:37 transport.db
  -rw-r--r-- 1 root root 12288  4月 8日 23:37 virtual.db

ターゲット show のコマンドの先頭に @ がついていますね。
先頭に @ がついていると、実行するコマンドが出力されなくなります。
(見せたくないときや、恥ずかしがりやさんに、つけてあげましょう。)


ちょっと息切れしてきましたが、もう一つだけ、紹介させてください。

それは、inetd の設定変更の簡略化です。

inetd の場合、/etc/inetd.conf を変更したときに、 SIGHUP シグナルを inetd に送信して、変更したことを知らせる必要があります。

というわけで、以下の Makefile を、お好きなところに作成しましょう。
(kill と @touch の前の空白は TAB ですよ。…しつこくてすみません。)

  PIDFILE = /var/run/inetd.pid

  inetd: $(PIDFILE)
  $(PIDFILE): /etc/inetd.conf
          kill -HUP `cat $(PIDFILE)`
          @touch $(PIDFILE)

そして、/etc/inetd.conf を変更して、make を実行しますと、 inetd に SIGHUP シグナルを送信してくれます。

  # make
  kill -HUP `cat /var/run/inetd.pid`

タイムスタンプの比較のために、PIDファイルを無理矢理使っています。
PIDファイルに touch することで、PIDファイルのタイムスタンプを更新しています。 これにより、kill コマンドの不必要な実行を抑制しているわけですね。

他のひとが直接 kill コマンドを実行すると抑制できない、 ということに気づいた貴兄は、スルドイです。
でも、長い人生、妥協も必要だと思いますよ。(達観しているふり)


以上、設定変更などの複雑な処理を、make を使って簡略化する方法を、 ご紹介しました。

肝はタイムスタンプの比較にある、と思いますので、 他にも様々な応用が考えられると思います。 暇なときにでも、チャレンジしてみてください。

しかし、新米管理者から見た場合、 処理内容を知らなくても管理できるということになりますので、 諸刃の剣と言えなくもない気がします。

宿題の答え

先週の宿題は、

  しばらくパスワードを変更していないユーザに、その旨をメールで通知
  しましょう。

でした。

英語ばっかりな回答例を、以下に示します。

  #!/bin/sh
  sendwarn() {
      /usr/bin/Mail -s "[Warning] Password" $1 << E-O-F
  Your password is too old. ($2 days passed.)
  Please update your password.
  E-O-F
  }

  [ $# -eq 1 ] && NOCHANGE=$1 || NOCHANGE=30
  TODAY=`expr \`date +%s\` / 60 / 60 / 24`
  LIMIT=`expr $TODAY - $NOCHANGE`
  IFS=:
  while read name pwd lstchg min max warn inact expire reserved; do
      if [ "$pwd" != '*' -a "$pwd" != '!!' -a $lstchg -le $LIMIT ]; then
          sendwarn $name `expr $TODAY - $lstchg`
      fi
  done < /etc/shadow

基本は、先週の最後にご紹介したスクリプトそのままです。
echo で出力していたところを、関数 sendwarn を使って、 メールを送信するようにしてみました。
関数 sendwarn では、Mail コマンドを呼び出しているだけです。

英語のメールだと、スパムと勘違いされるかもしれない、と思われる貴兄は、 sendwarn() を以下にすると、日本語のメールになります。
(ヘッダが必要ですので、sendmail コマンドを使用しました。)

  sendwarn() {
      subj="`echo \"[注意] パスワード\" | /usr/bin/nkf -M`"
      /usr/bin/nkf -m0 -j << E-O-F | /usr/sbin/sendmail -t
  From: root
  To: $1
  Subject: $subj
  MIME-Version: 1.0
  Content-Type: text/plain; charset="iso-2022-jp"

  あなたがパスワードを設定してから、すでに$2日経ちました。
  古いとヤバいので、お手数ですがパスワード変更してください。
  E-O-F
  }

今週の宿題

今週の宿題は、

  xinetd の設定ファイルの変更を反映するための Makefile を記述して
  みましょう。

です。

本編で inetd の例をご紹介しましたが、それの xinetd 版を、 ちょいっと作ってみてください。(あまりひねりはありません。)

あとがき

今日は、日曜日だというのに7時前に起きて、タケノコを掘ってきました。
よめの祖母の家の裏が竹林になっていて、毎年掘りに行っているのです。

例年では、黄金週間に行うのですが、去年は誰かに掘られてしまっていたのと、 今年はいつもより早いという噂を聞いたので、今日行くことになりました。

…が、やはりちょっと早過ぎたようで、4本しかとれませんでした。
(例年ですと、みんなで手分けして、50本くらいは掘れます。)

その代わりと言ってはなんですが、つくしが、 そこらじゅうにみっちりと生えていました。
つくしなんて見たことない…なんて言うほど都会っこではありませんが、 雑草のように生えているところを見るのは、生まれて初めてでした。

あまりにもあちこちに生えているので、そのうち採るのも飽きてしまったくらいです。 とはいえ、飽きるまでに、大量のつくしを採取しました。
いつもなら、しばらくタケノコ料理が続くのですが、 今回はつくし料理がしばらく続きそうな予感です。 (ちなみに、天ぷらがおいしいそうです。)

というわけで、疲れた体に鞭打って、書きました。(眠い…)
でも、肉体的な疲れは、心地よいですね。
年中 PC に向かっている貴兄も、たまには外に出て、疲れてみてはいかがでしょうか。 (なんじゃそりゃ)

 

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

 

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

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

「栗日記」−今週は、ひとんちのロゴや4コママンガを描いていました。
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

▼ せんでん




▼ 最近読んだ本

▼ 気に入ってる本