以下のテキストは、執筆時当時の情報を元に書いたものであり、 現在の情勢にそぐわないことを含む場合があるので注意されたい。 また、テキストは最終提出原稿で校正を経る前のものなので、実際に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@ Fingerprint16 = FF F9 FF CC E0 FE 5C F7 19 97 28 24 EC 5D 39 BA