動かし続ける

INPUT · スライド

記録を残す

01 / 08

あとで分からないという弱点

前のレッスンで、手を離せる仕組みを作ったね。

0 5 * * * /home/manabiya/tenken.sh

でも、朝5時に何が起きたかはあなたが見ていないでしょう。

うまくいった?失敗した?そもそも動いた?

全部分からないんだ。cron が残してくれるのは「動かした」ということだけだったね。

前のレッスンでは、こう書いて逃げていたよ。

… >> /home/manabiya/kekka.log 2>&1

これでも記録は残る。でも困ることが3つあるんだ。

1. ファイルが増える(仕事ごとに1つ作ることになる)2. 時刻が入らない(いつのことか分からない)3. 他の記録と並べて読めない

3つめが大事だよ。機械の中では、いろいろなものが記録を書いているでしょう。

syslogd   自分が始まったことcrond     仕事を動かしたことsu        誰が管理者になったか

これが全部1か所に、時刻の順で並んでいるんだ。

~ $ tail -3 /var/log/messagesAug 22 07:18 … syslogd started: BusyBox v1.37.0Aug 22 07:19 … crond: USER manabiya pid 88 cmd …Aug 22 07:19 … su: + ttyS0 root:manabiya

あなたの記録も、ここに混ぜられるんだよ。そのための道具が logger だね。

混ぜると何がいいかというと、こうなるんだ。

07:19:00  crond    仕事を始めた07:19:00  tenken   ファイルは5個07:19:01  tenken   おかしい! 空だった

話の流れとして読めるでしょう。別々のファイルに散らばっていたら、時刻を見比べて並べ直さないといけないよね。

02 / 08

logger の形

使い方はとても簡単だよ。

~ $ logger "hajimemashite"

これだけ。画面には何も出ないけれど、記録に書かれているんだ。

~ $ tail -1 /var/log/messagesAug 22 07:19:06 manabiya user.notice manabiya: hajimemashite

書かれたね。使える印は3つだよ。

すること既定
-t タグ誰が書いたかの名前ユーザー名
-p 重さどのくらい大事かuser.notice
-s画面(標準エラー)にも出す出さない

-t はほぼ必ず付けるよ。

logger -t tenken "owatta"

なぜかというと、あとで絞りこむためだね。

grep "tenken:" /var/log/messages

自分の仕事の記録だけを取り出せるでしょう。タグが無いと、他のものに埋もれてしまうんだ。

もう1つ、標準入力からも読めるよ。

~ $ ls /bin | wc -l | logger -t kazu

コマンドの結果をそのまま記録できるね。章4で覚えたパイプが、ここでも使えるでしょう。

-s は、手で試すときに便利だよ。

~ $ logger -s -t tesuto "kore de ii?"tesuto: kore de ii?

画面にも出るので、書けているか確かめられるんだ。ただし出るのは標準エラーのほうなので、取るときは 2> だよ(章4)。

03 / 08

記録の1行を読む

書かれた1行を分けて見てみようか。

Aug 22 07:19:06 manabiya user.notice tenken: owatta└──────┬──────┘ └───┬──┘ └────┬───┘ └─┬──┘ └─┬──┘     時刻        機械の名前   重さ    タグ   本文

5つに分かれているんだ。

場所誰が書いたか
時刻いつsyslogd が付ける
機械の名前どの機械かsyslogd が付ける
重さどのくらい大事か-p で指定
タグ誰の記録か-t で指定
本文何が起きたかあなたが書く

あなたが書くのは最後の3つだけで、時刻と機械の名前は勝手に付いてくるんだ。これが >> で自分のファイルに書くのとの大きな違いだよ。

echo "owatta" >> jibun.log        時刻が入らないlogger -t tenken "owatta"          時刻が入る

いつのことか分かるのは、とても大事でしょう。「先週の火曜に何が起きたか」を調べられるようになるんだ。

列を抜きたいときは、章5の道具が使えるよ。

~ $ awk '{print $5}' gyou.loguser.notice

ここで1つ注意があるよ。cut -d' ' は使わないんだ。

Aug 22 07:19:06 …     日が2桁 → 空白1つAug  2 07:19:06 …     日が1桁 → 空白2つ!

日によって空白の数が変わるでしょう。cut は空白1つずつ数えるので、ずれてしまうんだ。awk は空白がいくつ続いても1つの区切りとして見るので、こちらを使うんだよ。章5で「awk のほうが空白に強い」とやったのが、ここで生きるね。

04 / 08

重さ(facility と level)

-p に書く「重さ」は、2つの言葉を . でつないだものだよ。

user.notice└┬─┘ └─┬──┘ 種類   重さ

前がどの分野の話か(facility)、後がどのくらい大事か(level)だね。

分野は、こういうものがあるよ。

user      人が動かしたもの(あなたはこれ)daemon    ずっと動いているものauth      ログインや権限の話cron      時刻で動かす係syslog    記録の係そのもの

さっき見た記録に出ていたでしょう。

syslog.info   syslogd started …cron.info     crond: USER manabiya …auth.notice   su: + ttyS0 root:manabiya

どの分野の話か、ひと目で分かるね。

重さは8段階あるんだ。上が重いよ。

level意味
emerg機械が使えない
alertすぐ手当てが要る
crit深刻
errエラー
warning注意
notice知らせ(既定)
infoふつうの報告
debug細かい調べもの

覚えるのは3つだけでいいよ。

err        まずい(人が見る必要がある)warning    気になるinfo       ふつうの報告

なぜ重さを分けるのかというと、あとで絞れるからだね。

grep "user.err" /var/log/messages

まずいことだけを取り出せるでしょう。何千行あっても、エラーだけ見られるんだ。

だから作法はこうだよ。

> 全部を err で書かない

全部が err だと、絞る意味がなくなってしまうでしょう。「オオカミが来た」と毎回言う人の話は、誰も聞かなくなるよね。本当にまずいときだけ err にしておくんだ。

05 / 08

記録はどこにあるか

記録を集めて書いている係も、すでに動いているよ。

~ $ ps -o pid,args | grep syslogd   52 /sbin/syslogd -n

crond と同じデーモンだね(前のレッスンでやったでしょう)。

流れはこうなっているんだ。

logger -t tenken "owatta"  ↓ 記録の係に渡すsyslogd  ↓ 時刻と機械の名前を付ける/var/log/messages に1行足す

logger は自分でファイルに書いていないのが大事なところだよ。係に渡しているだけなんだ。

なぜそうするかというと、係が置き場を決められるようになるからだね。

置き場を変えたい      → syslogd の設定を変える別の機械に送りたい    → syslogd の設定を変える書く人(logger)は何も変えなくていい

本物の現場では、何十台もの機械の記録を1か所に集めることがあるんだ。書く側は同じままでいいでしょう。

この環境の置き場を並べておくね。

/var/log/messages    syslogd が書くもの(logger もここ)dmesg                カーネルの記録(別の置き場)

dmesgカーネル(Linux の中心)が書いたもので、syslog とは別に持たれているんだ。機械が起きたときの様子や、ハードウェアの話が入っているよ。ファイルではなくコマンドで読むのが特徴だね。

~ $ dmesg | head -5

記録を読むときの道具も並べておくよ。

tail -20 /var/log/messages       最近のできごとtail -f /var/log/messages        流れてくるのを見張る(Ctrl-C で止める)grep "tenken:" /var/log/messages 自分の記録だけgrep "user.err" …               まずいものだけ

章2と章3で覚えた道具が、そのまま使えるでしょう。記録もただのテキストなんだ。

06 / 08

何を記録するか

道具の使い方は簡単だったね。難しいのは何を書くかだよ。

まず、書きすぎるとこうなるんだ。

07:19:01 tenken: hajimeru07:19:01 tenken: file wo hiraita07:19:01 tenken: 1gyoume wo yonda07:19:01 tenken: 2gyoume wo yonda…(10万行)

読めないでしょう。記録が多すぎると、無いのと同じになってしまうんだ。

逆に、少なすぎるとこうなるよ。

07:19:01 tenken: shippai

何が失敗したのか分からないね。

ちょうどよい書き方の目安を3つ渡しておくよ。

1. 区切りを書く(始めと終わり)

logger -t tenken "hajimeta"logger -t tenken "owatta"

両方あると、動いたのか途中で止まったのかが分かるでしょう。終わりが無ければ、途中で死んだんだ。

2. 数を書く

logger -t tenken "file wa 5 ko"

「うまくいった」より 「5個だった」 のほうが役に立つよ。ふだんが5個なら、ある日 0 個になったときに気づけるでしょう。

3. まずいことは err で、理由を書く

logger -t tenken -p user.err "settei ga nai: /etc/tenken.conf"

何が無いのかまで書くんだ。あとで読むのは、たいてい忘れたあとの自分だからね。

書かないほうがいいものも1つあるよ。

> パスワードや秘密の文字を記録に書かない

記録は消しにくいし、他の人も読めることがあるんだ。うっかり書いてしまうと、あとから取り返せないでしょう。

07 / 08

cron とつなぐ

前のレッスンとつなげると、こうなるよ。

#!/bin/shset -eulogger -t tenken "hajimeta"KAZU=$(ls /home/manabiya | wc -l)if [ "$KAZU" -gt 0 ]; then  logger -t tenken "file wa $KAZU ko"else  logger -t tenken -p user.err "kara datta!"fi

これを cron にあずけるんだ。

0 5 * * * /home/manabiya/tenken.sh

すると、朝になってから読み返せるようになるよ。

~ $ grep "tenken:" /var/log/messagesAug 22 05:00:00 … tenken: hajimetaAug 22 05:00:00 … tenken: file wa 5 ko

あなたが寝ているあいだの出来事が、言葉で残っているでしょう。これが前のレッスンで足りなかったものだね。

1行で書く手もあるよ。表の中に直接書くんだ。

0 5 * * * /home/manabiya/tenken.sh || /usr/bin/logger -t tenken -p user.err "shippai"

|| は章11でやったね。失敗したときだけ記録するでしょう。スクリプトを直さずに、あとから足せるのが値打ちだよ。

どちらを選ぶかの目安はこうだね。

中の様子を残したい     → スクリプトの中に logger を書く成否だけ知りたい       → 表の中で || logger

両方書いてもいいよ。

そして、記録を読む習慣も付けておこうね。

grep "user.err" /var/log/messages

まずいことだけを、ときどき見る。これだけで「気づかないまま3か月壊れていた」を防げるんだ。記録は書くだけでは意味がなくて、読まれてはじめて役に立つでしょう。

08 / 08

さあ、打ってみよう

この回で使う形をまとめておくね。

logger "本文"                    記録に1行足すlogger -t タグ "本文"            名前を付ける(ほぼ必ず)logger -t タグ -p user.err "…"   重さを変えるlogger -s -t タグ "…"            画面にも出す(2> で取れる)コマンド | logger -t タグ         結果をそのまま記録する

読むほうも並べておくよ。

tail -20 /var/log/messages       最近のできごとgrep "タグ:" /var/log/messages    自分の記録grep "user.err" …               まずいものだけawk '{print $5}' …              列を抜く(cut は使わない)dmesg                            カーネルの記録

今日いちばん覚えてほしいことは3つだよ。

1. -t でタグを付ける(あとで絞るため)2. 全部を err にしない(絞る意味がなくなる)3. 時刻は勝手に付く(自分で書かなくていい)

そして今日の結論。

> 見ていないあいだの出来事を、言葉で残しておく

前のレッスンで手を離せるようになったね。今日は、その手を離したあいだに何が起きたかをあとから読めるようにしたんだ。この2つが揃って、はじめて安心して任せられるでしょう。

この回には1分待つ問題が1つあるよ。最後の総まとめだね。

次のレッスンからはネットワークに入るよ。ip で自分の住所を確かめて、ping で届くかを試して、最後は自分で Web サーバーを立てるところまでいくんだ。では打ってみよう。