システムログの読み方とメール配信

以下のテキストは、執筆時当時の情報を元に書いたものであり、 現在の情勢にそぐわないことを含む場合があるので注意されたい。 また、テキストは最終提出原稿で校正を経る前のものなので、実際にUNIXUSER 本誌に記載されたものとは異なる。誤字脱字等そのままである。

致命的な誤り以外は加筆修正等は行なわないので情報の鮮度に気をつけつつ 利用して欲しい。

目次


【Part 3 ログの記録とメール配信】

システム管理はトラブルの解決の連続である。発生トラブルをいかに早く解決で
きるかというのも大事だが、それと同時にトラブルの前兆を的確に見抜くことも
非常に重要である。トラブルの前兆や症状を知るための手がかりとなるのがシス
テムログである。Part3では標準的システムで記録されているログについて紹介
し、実際にログを見て必要な情報を抜き取る技法について簡単なものを紹介した
い。生データから統計的情報を得る技法はログファイルのみならず、他の業務の
データ処理をする場合にも非常に役に立つのでぜひ頑張って修得して頂きたい。

■
■/var/logの構造
■
OS初期インストール後、管理者が後からインストールしたものなど一部を除き、
システムログは、慣習的に /var/log にまとめて格納されている。このディレク
トリにあるファイルのほとんどは、/etc/syslog.conf の中で書き出し先を定義
されているものである。syslog.conf についてはPart4を参照して欲しい。

ここでは、定義を追いかけるのではなく、一般的なログファイルの役割を探って
行こう。代表的なシステムとして Red Hat Linux と FreeBSD について、それぞ
れの/var/log ディレクトリに書き出されるログにどのようなものがあるか見て
いこう。

●
●ログひとめぐり

・ Red Hat Linux
  
何をもって「標準的」とするかは難しく、また正解もないのだが、それを追求し
ていたら先に進めないので(笑)、筆者の環境で Red Hat Linux 7.3 のインストー
ルを済ませた状態のマシンを題材とする(次節のFreeBSDの解説も同様)。このマ
シンで /var/log にあるファイル一覧を見ると、以下のようになる。

[root@ape log]# ls -F
XFree86.0.log     httpd/            secure
boot.log          ksyms.0           spooler
canna/            lastlog           squid/
cron              maillog           up2date
cups/             messages          vbox/
dmesg             rpmpkgs           wtmp
fax/              sa/               xferlog
gdm/              samba/

システムログとしてとくに重要なファイルは含まれているので、このリストにあ
るログファイルの持つ意味は【表 い】のようになる。このうち、とくに重要な
ものについて解説を加えよう。

【表 い】	/var/log の基本的ログファイル------------------------------
  - XFree86.0.log

	XFree86の起動情報に関するログ。

  - boot.log

	システムブートまたはシャットダウン時の各種デーモン起動/停止時の
	メッセージが保存される。実際は initlog(8) でログ出力されるものが
	保存される。

  - canna/

	かな漢字変換システム Canna に関するログディレクトリ

  - cron

	cronジョブの実行ログ結果が保存される。

  - cups/

	プリンティングシステム(Common Unix Printing System)関連のログディ
	レクトリ

  - dmesg

	カーネルリングバッファログが格納される。tailと組み合わせることで
	継続的に監視できる。

  - fax/

	efax関連のログディレクトリ
	%%%%具体例未確認!

  - gdm

	gdm は gnome display manager関連のログ

  - httpd/

	Apache(httpd)関連のディレクトリ

  - ksyms.0

	カーネルシンボルの情報ログファイル

  - lastlog

	システムにログインしたアカウントのログ。last(1)やlastlog(8)コマ
	ンドで利用する。

  - maillog

	メイル配送関連のログが記録される。MTAだけでなくpopperプログラム
	のログが出力されることもある。

  - messages

	汎用的なログファイル。

  - rpmpkgs

	システムにインストールされたパッケージのログ(/etc/cron.daily/rpm
	スクリプトによって作られる)

  - sa/

	システムアカウント関連のログ


  - samba/

	samba (註: http://www.samba.org/) 関連のログ

  - secure

	セキュリティ関連のログ

  - squid

	squid(プロクシ)のログ

  - up2date

	up2date(Update Agent)によるパッケージアップデートのログ

  - wtmp

	ログイン記録。login(1), init(1)で管理している。wtmp(5)を参照のこ
	と。

  - xferlog

	ftpサーバのトランスファ(転送)ファイルのログ。xferlog(5)、ftpd(8)
	を参照のこと。

------【表 い】ここまで---------------------------------------------------


 * XFree86.0.log

	既に X Windows System が正常起動して利用できているのなら無縁かも
	しれないが、Xのアップグレードなどを行なった場合に、X が起動しな
	くなることがある。このような場合、XFree86.0.log ファイルに書き出
	されている情報を見ると良い。ログファイル自体に書かれている

	Markers: (--) probed, (**) from config file, (==) default setting,
        	 (++) from command line, (!!) notice, (II) informational,
	         (WW) warning, (EE) error, (??) unknown.

	の記号を参考に読んで行くと良いだろう。Xが起動しない典型的な原因
	としては

	o ビデオチップの認識不整合
	o ディスプレイの解像度不足
	o マウスがつながっていない

	などがあるが、ログファイルの先頭の記号を頼りにどこで深刻なエラー
	が出ているかを知ることで適切に対処することができる。

 * cron

	cron(8)ジョブの実行ログが記録される。ここに記録されるのはジョブ
	を実行した出力結果ではなく

Sep 05 06:01:00 ape CROND[7230]: (root) CMD (run-parts /etc/cron.hourly) 

	のように日付、ホスト名、PIDの後に、ジョブの実行ユーザと実際に起
	動したコマンドが出力される。実行したジョブの結果はメイルで送られ
	る。この制御の仕方については後述。

 * messages

	厳密には syslog.conf で書かれるログの種類が指定されるが、おおざっ
	ぱに言うと管理上重要なログメッセージはほとんど messages ファイル
	に入ると言って良い。システムに変更を加えるとき、トラブルの調査に
	当たるときはまずは messages ファイルに書かれるメッセージに注目す
	る習慣を付けたい。

* secure

	システムの認証などセキュリティ関連のログ。たとえば、sshdによる外
	部からのログイン履歴や、sudoによるコマンド実行履歴などが記録され
	る。


・FreeBSD

FreeBSD 4.6.2 の /var/log に含まれるファイルで代表的なものは以下のように
なる。

balius# ls -F
XFree86.0.log     lastlog           sendmail.st
cron              lpd-errs          setuid.today
dmesg.today       maillog           setuid.yesterday
dmesg.yesterday   messages          slip.log
ip6fw.today       mount.today       userlog
ip6fw.yesterday   mount.yesterday   vinum_history
ipfw.today        ppp.log           wtmp
ipfw.yesterday    security

これらについて役割を解説しよう。

  - XFree86.0.log
  - cron
  - lastlog
  - maillog
  - messages
  - security
  - wtmp

	これらについてはLinuxと同様

  - dmesg.today
  - dmesg.yesterday

	dmesg(8)のメッセージ出力の当日分と前日分。/etc/security スクリプ
	トによって生成される。/etc/security はcronによって毎日実行され、
	以下で説明する各種ログも含めた「前日分/当日分」の差分を管理者宛
	にメイルで送る。

  - ip6fw.today
  - ip6fw.yesterday
  - ipfw.today
  - ipfw.yesterday

	ipfw(IP firewall)とip6fw(IPv6 firewall)のルールセットのうち
	deny, reset, unreach のものの、当日分前日分のもの。

  - lpd-errs

	lpdによるメッセージが書き出されるログ

  - mount.today
  - mount.yesterday

	システムにmountされているファイルシステムのログ。mount -p の結果
	の当日分と前日分。

  - ppp.log

	ppp(8)のログ。/etc/ppp/ppp.conf でどの程度の情報をログに残すかを
	設定できる。

  - sendmail.st

	sendmailの統計情報。

  - setuid.today
  - setuid.yesterday

	システムのローカルファイルシステム(ufs)上にあるsetuidファイル一
	覧の当日分と前日分。該当ファイルを ls -liTd で表示した結果が1行
	にひとつずつ格納される。

  - slip.log

	slip(8)(Serial Line IP)のログ。今ではどんなPCでもネットワークイ
	ンタフェースカード(またはそれを差すスロット)が備わっているが、
	PCMCIAスロットの無い時代のノートPCなどでは、シリアルデバイスを使っ
	てIP接続したものだった。

  - userlog

	追加したり削除したユーザアカウントの情報。pw(8)コマンドを利用し
	てユーザアカウント管理をした場合にこのログファイルに記録される。
	ログは、
2002-07-25 22:20:04 [root:useradd] kay(3234) home /home/gentei/kay made
	のような形式で、日付、実行ユーザとコマンド、操作対象のアカウント
	とそのUID、最後に為された操作の概要が記される。

  - vinum_history

	vinum(8)(Logical Volume Manager)の操作ログ。



■
■ログの見方
■

どのような記録されているかを知ることも大事だが、それらの中からとくに重要
な情報を抜き出したり、情報を組み合わせて新たな情報を作りだせてこそ本当に
システム管理に活かせているといえる。

ここでは、ログの具体的な中味の説明を詳しく行なうのではなく、むしろ見ると
きに活用できるUnixコマンドの効果的な使い方について解説する。

●各コマンドの利用

いくつかのコマンドをログ監視の目的に特化した視点で有用な使い方を示そう。
どの項目の説明にも当てはまるが、今回紹介する機能はほんの一部に過ぎないの
で、興味を持ったらマニュアルを熟読するとより新しい使い方が見つかるだろう。

  ・ less

  テキストファイルを見るときの一番ポピュラーなツールがlessだろう。

	% less [-オプション] ファイル名………

  で起動して、SPC(b)で1画面進み(戻り)、j(k)で1行ずつ進む(戻る)といったあた
  りはlessを利用したことのある人なら知っているだろう。ログを見る場合には
  lessに備わっている検索機能を十分に活用したい。

  検索はlessを起動した画面で以下のキーをタイプする。

	/	末尾方向検索
	?	先頭方向検索

  /または?をタイプし、正規表現を入力し目的の行を探す。続けて検索した場合
  には以下のキーが便利である。

	n	同一方向で次にマッチするものを探す
	N	逆方向で次にマッチするものを探す

  また、ログファイルでは、特定のパターンにマッチしないものを探したい場合
  もあるだろう。たとえば、Linux:/var/log/boot.log では、
Sep 14 02:52:21 ape syslog: syslogd startup succeeded
Sep 14 02:52:21 ape syslog: klogd startup succeeded
Sep 14 02:52:21 ape portmap: portmap startup succeeded
Sep 14 02:52:22 ape nfslock: rpc.statd startup succeeded
Sep 14 02:52:22 ape keytable: Loading keymap:  succeeded
Sep 14 02:52:22 ape keytable: Loading system font:  succeeded
Sep 14 02:52:22 ape random: Initializing random number generator:  succeeded
  :
  のように、正常に起動できた場合に "succeeded" という文字列が付けられる
  が、トラブルが起きたときに実際に見たいのは "succeeded" ではないログ行
  だろう。このような場合は、検索時に / や ? の直後に!を指定することで、
  指定したパターンを「含まない」行を検索できる。このように検索パターンの
  直前にタイプして、検索の意味を変えるものがいくつかあるので覚えておくと
  便利だろう。以下のキーは、/または?を押した直後の検索パターン入力プロン
  プトで有効なものである。

	!	パターンを含まないものを検索
	*	複数のファイルを指定したときにファイル境界を越えて複数の
		ファイルから検索
	@	コマンドラインで指定した全てのファイルのうち最初のファイ
		ルの先頭位置から検索を始める(?の先頭方向検索の場合は最後
		に指定したファイルの末尾から検索を始める)
	C-k	ファイルの表示位置は現在のままで、表示画面内でマッチした
		文字列のみをハイライト表示する
	C-r	検索パターンを正規表現ではなく単純文字列で指定する

  また、ログファイルは順次追記されて行くものであるから、ファイルを読んで
  いる間に内容が増えていることもある。このような場合は

	F	末尾にスクロールしてからファイルの終端を読み続ける

  を利用すると良いだろう。これは、後述する "tail -f" と同様の効果を対話
  的に得たい場合に便利である。

  ・ tail

  ファイルの末尾の数行(デフォルトで10行)を見るためのコマンドだが、-f オ
  プションを利用することで増え続けるファイルの末尾を継続的に監視すること
  ができる。典型的使用例として、

	# tail -f /var/log/messages

  とすると messages ファイルに新しい行が書き足されるたびにそれが端末に表
  示される。

  ・ grep/egrep/fgrep

  grepを知らなかったらUnix使いとはいえないだろう。と言える程利用曲面の広
  いユーティリティである。ログファイルを見る場合、あらかじめ見たい行のパ
  ターンが決まっていることが多い。そのようなときには、lessでファイルを直
  接開いて / で検索するよりも、先にgrepで該当行だけ絞りこんでしまう方が
  効率が良い。

	% grep 正規表現 ファイル…… | less

  また、egrep で拡張正規表現を指定して、複数のパターンをOR結合して検索す
  ることができる。たとえば、

	% tail -f /var/log/messages | \
	    egrep -vi 'success|starting|fsck.*clean'

  とすると、messages ファイルに書き出される内容のうち
  「success または starting または fsck.*cleanというパターン」の含まれな
  い行のみを表示する。egrepに与えた -v は「含まれない行のみを出力」、-i
  は大文字小文字を同一視するという意味である。

  fgrepは、Fixed grep の意味で固定文字列を検索するときに利用する。たとえ
  ばIPアドレスに良く現れるピリオドは、正規表現では「任意の1文字」という
  意味である。したがって、 "grep 10.1.2.3 foo.log" などとした場合
  "1001.233" などもマッチしてしまう。このように、検索文字列の中に正規表
  現のメタキャラクタ( . * [ ] など)そのものを含む場合は、fgrepを使うのが
  いちばん便利だろう。


  ・ awk

  ログファイルは出力形式が決まっているものが多いので、一行のうち特定の位
  置に書かれたものを集めることで統計情報を得ることなどが容易にできる。そ
  のようなときにawkが非常に役に立つ。今ではperlに主役を奪われた形となっ
  てしまったが、本格的スクリプト言語の走りといえよう。awkは Aho,
  Weinberger, Kernighan 三者により開発された行入力指向のプログラミング言
  語である。きっちりプログラミングを楽しむこともできるが、本稿ではコマン
  ドライン利用するときに必要な知識だけ説明しよう。

  awkを利用する上で以下の約束は重要である。

    * awkプログラムに与えられる入力の
      1行全体のことを「レコード」
      1レコードのうち空白で区切られたひとつの部分を「フィールド」
      という

    * awkプログラムはコマンドラインの最初の引数(オプションを与えた場合は
      その直後)に書く。awkスクリプトをファイルに書いた場合は -f オプショ
      ンの次にスクリプトファイル名を与える。前者の場合は、

	% awk 'プログラムテキスト'  [処理対象ファイル]…

      という形式で、後者の場合は、

	% awk -f スクリプトファイル  [処理対象ファイル]…

      となる。ログ処理程度の目的なら主に前者の起動になるだろう。ちなみに
      「プログラムテキスト」の部分には、$ 記号を書くこともあるので、シェ
      ルによる$展開を抑制するためにシングルクォート '' で括るのが間違い
      防止のためには有利だろう。

    * レコード中のフィールドは、左から順にawkプログラム中の変数
      $1, $2, $3, ..., $NF に代入される。NFはawkの予約変数で処理対象レコー
      ドに含まれるフィールドの数で $NF が最終フィールドの値となる。たと
      えば、awkプログラムの入力レコードが

	USER       PID %CPU %MEM   VSZ  RSS TTY      STAT START   TIME COMMAND
	root         1  0.0  0.4  1368  476 ?        S    Sep14   0:04 init

      だった場合、1レコード(1行目)は

	1レコード目	$1="USER", $2="PID", $3="%CPU"...,
			$10="TIME",$11 = "COMMAND"
	2レコード目	$1="root", $2="1", $3="0.0"...,
			$10="0:04",$11 = "init"

      のように$変数に代入される。

    * awkプログラムは

	パターン1 { アクション }
	パターン2 { アクション }
	  :

      という形式で記述される。入力レコードのうち、各「パターン」に一致し
      た場合に、直後の「アクション」を評価する({ }に囲まれた部分を「ブロッ
      ク」と言う)。「パターン」にはいろいろ書けるがコマンドライン利用に
      限れば、以下のものを覚えておけば十分だろう。

	/正規表現/	レコードに「正規表現」にマッチするものがあれば真
	BEGIN		特殊パターンで、プログラムの最初のレコードを読む
			前に一度だけ真になる
	END		特殊パターンで、プログラムの最後のレコードを読ん
			だ後に一度だけ真になる

      とくにパターンを前置しないブロックは、全ての入力レコードに対して実
      行される。たとえば、

	# ps aux | \
	  awk 'BEGIN {sum=0} \
	       {sum += $5} \
	       END {print sum}'

      のようなプログラムテキストを指定すると、ps aux の出力全てが awk プ
      ログラムに渡される。まず最初のBEGINブロック内の sum=0 が実行される。
      Perlと違いawkではユーザ変数は$を前置しない(註: awkは変数を初期化し
      なくても良いのでこの例の場合BEGINブロックは無くても機能する)。

      続く条件なしのブロック {sum += $5} が入力レコード全てに対して実行
      される。ps aux の出力を見れば分かると思うが、第5フィールドはVSZで
      あるので、この値だけ sum 変数に次々加算して行く。レコード入力が終
      わった後で、ENDブロックが実行される。この場合、{print sum} である
      から、VSZの値を全て足した数値が出力される。

  awkはデフォルトで空白文字を区切りとしてフィールド分割するが、-F オプショ
  ンで区切り文字を変えることができる。

	# awk -F: '{print $1,$6}' /etc/passwd

  とすると、フィールド区切り文字を :(コロン)にしてから /etc/passwd を読
  みこむ。この例の場合、passwdファイルのうちユーザ名とホームディレクトリ
  だけを抽出して出力する。

  ・ sort

  sortは入力を1行1レコードとして読み込み、指定したフィールドの値を基準に
  並べ替えた結果を出力する。良く用いる以下のオプションは覚えておきたい。

	-n	逆順(降順)に並べ替える(デフォルトは辞書順)
	-r	フィールドを数値と見なして並べ替える
	-k フィールド1[,フィールド2]
		評価対象とするフィールドを指定する(デフォルトは第1フィー
		ルド)。フィールド2を指定すると、フィールド1からフィール
		ド2までのフィールドを評価対象とする。
	-t	フィールド区切り文字を変更する。

  ログファイルを見るという観点でいうと、ファイルの各行を並べ替えるという
  だけではあまり有用でない。以下で説明するuniqと組み合わせると簡単な統計
  を即座に取ることができる。

  ・ uniq

  入力のうち、連続した重複した行を取り除く。今回の用途で有用なのは以下の
  オプションだろう。

	-c	各行の出力前に連続出現回数を示す数値をつけくわえて
		表示する
	-u	過去に一度も出現していない行のみ表示する

  -c オプションはランキング的なものを作るときに非常に有用である。たとえ
  ば、ApacheのアクセスログからWebページアクセスランキングを作る場合は以
  下のようにする。デフォルトのアクセスログの書式はたとえば、次のようになっ
  ている(ページ幅の都合上\で折り返している)。

	foo-bar.co.jp - - [16/Sep/2002:00:13:13 +0900] \
	"GET /~yuuji/software/mpg123el/ HTTP/1.1" 200 6623

  awkで切り出す場合を考えて空白をデリミタとしてGETしたURLの記されている
  フィールド位置を調べると第7フィールドとなる。これだけを全て抽出して
  sort するとGETされたURLだけが辞書順に並べ替えられる。すると、同じパス
  が連続して並ぶことになるのでこれを unic -c で集計すればアクセス数のリ
  ストになる。

	% awk '{print $7}' /var/log/httpd/access_log | sort | unic -c
	  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
	  67 /
	   2 /%7Eakitsugu/gb/
	   3 /%7Eet/gb/
	   5 /%7Efuji/gb/
	   6 /%7Ehiyokko/gb/
	   3 /%7Einagaki/gb/
	     :
	     :

  これはパス名を辞書順に並べ替えた場合の順序で登場するのでこの結果を先頭
  の数値で降順に並べ替えればランキングとなる。

	% awk '{print $7}' /var/log/httpd/access_log | sort | \
	  unic -c | sort -nr | cat -n
	     1  2106 /~yuuji/software/imapext/
	     2  1328 /~yuuji/yatex/info2/prev.gif
	     3  1322 /~yuuji/diary/2002/
	     4  1313 /~yuuji/yatex/info2/up.gif
	      :
	      :

  cat -n は入力に対して行番号を与えたものを出力する。

  このように、awk, sort, uniq を組み合わせるだけで統計的情報を得るのが非
  常に簡単に行なえる。


■
■ログ閲覧のためのツール
■

トラブルの原因を本腰を入れて探すときには、フィルタを駆使することが必要だ
が、日常的にログの変化に目を通すときには、ログ閲覧に特化したツールを利用
するのが効率的である。そのためのツールはいくつかあるが、ここでは
swatch, logsurfer について簡単に紹介しよう。

  * swatch (The System WATCHER by Todd Atkins)

    swatch は、一つのログファイルをつねに監視し、あらかじめ管理者が指定
    したパターン(正規表現による)にマッチするメッセージが対象ログファイル
    に書き出されたタイミングで、なんらかのアクションを起こすようにできる。
    ごく簡単な例としては、設定ファイルに

	watchfor /file system full/
	mail=root,subject=FileSystemFull

    と書いておけば、/file system full/ にマッチする行がログに書かれたと
    きに、そのメッセージをroot宛に送る。その他、端末のベルを鳴らしたり、
    指定したコマンドにメッセージを送るなどのことも可能である。詳細は、
    http://www.oit.ucsb.edu/~eta/swatch/ を参照のこと。

  * logsurfer (by Wolfgang Ley and Uwe Ellerman)

    logsurfer は、swatchにあった問題点を解決し、より柔軟なログメッセージ
    監視ができることを目指して開発された。たとえばswatchは、Perlスクリプ
    トなのでPerl本体のインストールが必要だが、重要サーバでは時にこれが障
    害となる。logsurferはCで記述されているのでコンパイルしたコマンドをイ
    ンストールするだけで良い。またswatchは、メッセージを1行単位でしか処
    理しないが、ログメッセージの中には何行かに渡って関連するメッセージが
    表示されるものがある。logsurferでは「コンテキスト」(文脈)を限定した
    上で、到着したメッセージに対するアクションを書けるので、より精度の高
    い選別が可能になる。他にも、メッセージを選択する正規表現パターンに加
    えて、その中から特定のパターンをを取り除くための「除外パターン」も書
    けたり、ログファイルがローテートされたときの自動読み直しが行なえたり
    するなど、様々な機能が用意されている。詳細は、
    http://www.cert.dfn.de/eng/logsurf/ 参照のこと。

■
■システムログのメイル配信
■

/var/log にあるログファイル以外にも、システム管理上重要な情報がメイルで
届くようになっている。これはcronによって自動起動されるジョブが発信元になっ
ていて、1日、1週間、1ヶ月などに一度の頻度であらかじめ決められたスクリプ
トを呼ぶようになっている。これらはたいてい root ユーザ宛に配送されるので
システム管理者はroot宛メイルを自分宛にフォワードするなりして受け取るよう
に心掛ける必要がある。

●ジョブ起動と結果配送の仕組み

定期的に行なわれているジョブが、具体的にどのように起動されているかを Red
Hat、および FreeBSD 4 の場合について追いかけてみよう。

  * Red Hat のcronジョブ

  Red Hat 7.3 の場合システムのcronジョブは、/etc/crontab に登録されてい
  る。これはたとえば以下のようになっている。

	SHELL=/bin/bash
	PATH=/sbin:/bin:/usr/sbin:/usr/bin
	MAILTO=root
	HOME=/
	
	# run-parts
	01 * * * * root run-parts /etc/cron.hourly
	02 4 * * * root run-parts /etc/cron.daily
	22 4 * * 0 root run-parts /etc/cron.weekly
	42 4 1 * * root run-parts /etc/cron.monthly

  詳細はcrontab(5)manページを参照していただくとして、ファイルは環境変数
  の設定と、どの時刻にどんなコマンドを起動するかを記述するようになってい
  る。この例では、

	毎時01分に	run-parts /etc/cron.hourly
	毎日04:02に	run-parts /etc/cron.daily
	日曜04:22に	run-parts /etc/cron.weekly
	毎月1日04:42に	run-parts /etc/cron.monthly

  を起動するようになっている。run-parts は /usr/bin にあるbashスクリプト
  で、指定したディレクトリ内にある実行可能ファイルを全て実行するものであ
  る。各ディレクトリには【表 ろ】〜【表 に】のようなスクリプトが納められ
  ている。パッケージを追加するとここにもcronジョブスクリプトが置かれるこ
  ともあるので、読者の環境では表より多くのものがあるかもしれない。

-----[表 ろ]--- cron.dailyのスクリプト --------------------------------
00-logwatch	/var/log にあるログファイルのうち変動(追加)のあったもの
		についてroot宛にメイル通知する
0anacron	anacron用【★ほ】のタイムスタンプをアップデートする
		ためのもの
logrotate	logrotate(8)を起動する。/etc/logrotate.conf によって動作
		を決定する。
makewhatis.cron	マニュアルページのwhatisデータベースを更新する(新しいペー
		ジのみ)
----------------------------------------------------------------------
-----[表 は]--- cron.weeklyのスクリプト ------------------------------
0anacron	anacron用のタイムスタンプをアップデートする
makewhatis.cron	マニュアルページのwhatisデータベースを更新する
----------------------------------------------------------------------
-----[表 に]--- cron.monthlyのスクリプト -----------------------------
0anacron	anacron用のタイムスタンプをアップデートする
----------------------------------------------------------------------

-----[註 ほ]----------------------------------------------------------
シャットダウンタイムが長いホストのために設計されたcron。
----------------------------------------------------------------------


  * FreeBSD のcronジョブ

  FreeBSDも Red Hat と同様、システムの持つデフォルトのジョブは
  /etc/crontab ファイルに記録されている。デフォルトでは以下の内容となっ
  ている。

# /etc/crontab - root's crontab for FreeBSD
#
# $FreeBSD: src/etc/crontab,v 1.21.2.3 2000/12/08 10:56:07 obrien Exp $
#
SHELL=/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin
HOME=/var/log
#
#minute hour    mday    month   wday    who     command
#
*/5     *       *       *       *       root    /usr/libexec/atrun
#
# rotate log files every hour, if necessary
0       *       *       *       *       root    newsyslog
#
# do daily/weekly/monthly maintenance
1       3       *       *       *       root    periodic daily
15      4       *       *       6       root    periodic weekly
30      5       1       *       *       root    periodic monthly
#
# time zone change adjustment for wall cmos clock,
# does nothing, if you have UTC cmos clock.
# See adjkerntz(8) for details.
1,31    0-5     *       *       *       root    adjkerntz -a


  コメントが豊富なので分かりやすいだろう。periodic コマンドは
  /etc/periodic ディレクトリの daily, weekly, monthly 内にあるスクリプト
  群を実行するものである。これらのディレクトリにあるスクリプトを実行する。
  これらのディレクトリには日常的な管理に必要なものが数多く書かれている。
  中にはスクリプトは用意されているもののデフォルトでは機能しないようになっ
  ているものもある。たとえば、/tmp ディレクトリで長期間参照されないファ
  イルを消すというジョブが記述されているが、デフォルトでは無効化されてい
  る。これら設定は、全て /etc/defaults/periodic.conf に書かれている。も
  し、デフォルト設定を変えたい場合は、/etc/periodic.conf を新たに作成し、
  デフォルトと違う動作をさせたいもののみ変数を設定すると良い。
  /etc/defaults/periodic.conf を見ると以下のように書かれていることが分か
  る。
----------------------------------------------------------------------
# Daily options

# These options are used by periodic(8) itself to determine what to do
# with the output of the sub-programs that are run, and where to send
# that output.  $daily_output might be set to /var/log/daily.log if you
# wish to log the daily output and have the files rotated by newsyslog(8)
#
daily_output="root"                                     # user or /file
daily_show_success="YES"                                # scripts returning 0
daily_show_info="YES"                                   # scripts returning 1
daily_show_badconfig="NO"                               # scripts returning 2
  
  〜中略〜

# 120.clean-kvmdb
weekly_clean_kvmdb_enable="YES"                         # Clean kvmdb weekly
weekly_clean_kvmdb_days=7                               # If not accessed for
weekly_clean_kvmdb_verbose="YES"                        # Mention files deleted
  :
  :略
----------------------------------------------------------------------

  periodic.conf は rc.conf と同様、シェル変数への代入形式になっている。
  periodic.conf では、変数名が「頻度_ジョブの種類」という命名法で統一さ
  れているので、該当するスクリプトを /etc/periodic/「頻度」 のディレクト
  リから探し、cronジョブで行なわせたい作業なら変数の値に "YES" を、行な
  わせない作業なら "NO" を指定する。もちろん、デフォルトの periodic.conf 
  とことなる場合だけ明示的に指定すれば良い。たとえば、
  /etc/periodic/daily/110.clean-tmps はファイル名から想像が付くように、
  「/tmp ディレクトリの掃除」は、をするスクリプトである。このスクリプト
  を見ると、先頭付近に

	case "$daily_clean_tmps_enable" in
	    [Yy][Ee][Ss])

  とあることから daily_clean_tmps_enable 変数で動作を決定していることが
  わかる。これは、デフォルトで無効になっているので、これを有効にしたい場
  合は、/etc/periodic.conf に

	daily_clean_tmps_enable="YES"

  と書けば良い。


●配送先の変更

cronジョブの結果はデフォルトでroot宛に送られる。この送信先は Red Hat,
FreeBSD いずれの場合もcronジョブ実行時の環境変数 MAILTO の値で変更できる。
これは crontab ファイル内で設定することができる。もし、全てのジョブの結
果を admin 宛に送りたい場合は 

	MAILTO=admin

と書けば良いだろう。もちろん、MTAの設定でroot宛のメイルを別のユーザに転
送するalias設定をしても良い。sendmail の場合は /etc/mail/aliases ファイ
ルに

	root:	addr1, addr2

のように、root宛メイルを転送する宛先(この例では addr1 と addr2 をカンマ
で区切って列挙する。更新したら newaliases するのを忘れずに。qmailの場合
はroot宛のメイルの配送先は ~alias/.qmail-root で決定するので、その中に

	&addr1
	&addr2

のように1行1アドレスで転送先アドレスを列挙すれば良い。


■
■まとめ
■
ログファイルは、システムの診断書とも言える重要な情報を持っている。ここに
記された何かの予兆を見逃さないことが管理者の重要な責務と言えよう。その際
にUnixコマンドを効果的に利用して重要な部分を抜き出すことが可能である。
Unixには数多くのフィルタコマンドが用意されているので、ログファイル集計を
題材に、スキルアップに挑戦してみてはいかがだろうか。



yuuji@gentei.org
Fingerprint16 = FF F9 FF CC E0 FE 5C F7 19 97 28 24 EC 5D 39 BA
HIROSE Yuuji - ASTROLOGY / BIKE / EPO / GUEST BOOK / YaTeX [Tweet]