More Related Content
Similar to Ilstudy001_20110806
Similar to Ilstudy001_20110806 (20)
Ilstudy001_20110806
- 2. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~
自己紹介
名前: 濱田 康貴 (はまだ やすたか)
所属: インターリンク株式会社
http://www.interlink.ne.jp/
職業: インフラエンジニア
趣味: Linux、自転車、勉強会参加とか運営とか
7つ道具: vim bash パワポ netstat ps grep awk
将来の夢: GEEK団地(データセンタ併設住宅) 建設
インターリンク株式会社
- 7. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~
• シェル(殻)とは、ユーザから入力されたコマンドを解釈し、プロ
グラムを起動するアプリケーションであり、OSの機能を実装してい
るカーネル(中心核)を貝殻のように覆うようにして動作する。
今何時かな? shell
date
命令応答
Unix
Linux
Kernel
Thu Apr 21 11:53:44 JST 2011
インターリンク株式会社
- 10. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~
シェルのおしごと
1. ユーザが入力したコマンドをカーネルに伝える(シェルは人の命
令を仲介しOSに実行させる)
2. プログラムを終了させたり、フォアグラウンド・バックグラウンドを
切り替えたりする
3. まとまった一連の入力をシェルスクリプトとして実行する
4. プログラムの出力をファイルにリダイレクトしたり、パイプに
渡すことで他のプログラムの入力としたりする
5. 変数や他のコマンドの出力結果を取り込んで加工し、出力
する
インターリンク株式会社
- 12. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~
シェルスクリプトってどうやって書くの?
- シェルスクリプトを動かしたいコンピュータへSSHやtelnetなどで
ログインし、viなどのエディタを使ってシェルスクリプトを書く
- 手元のコンピュータでシェルスクリプトを書いてFTPやSCPなど
を使い、シェルスクリプトを動かしたいコンピュータへアップロード
する (文字コードや改行コードの違いに注意)
- chmodコマンドを使い書き終わったシェルスクリプトへ実行権を
つけて実行する
インターリンク株式会社
- 15. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~
1 シェルスクリプトを書いて実行する際のお約束
シェルスクリプトの先頭1行目には、スクリプトを読み込むインタプ
リタを「#!」から始まる書き出しで記述します。
例)
これらを「シバン (she-
#!/bin/sh bang)」と呼びます
#!/bin/bash
#!/bin/csh
インターリンク株式会社
- 21. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~
2 出力結果をリダイレクトする際のお約束
シェルスクリプトの出力結果は、標準出力または標準エラー出力
に表示されます。ファイルやコマンドにリダイレクトしない場合は、コ
ンソールやSSHクライアントに表示されます。
シェルスクリプトのリダイレクトは、主に次の3つを使います。
インターリンク株式会社
- 22. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~
| 「パイプ」と呼ばれる。パイプ左辺で実行されたコマンドを
パイプ右辺のコマンドへ渡す役割を担う。
> hoge.sh > file.txt と実行することにより、出力結果
が file.txt に上書きされる。
>> hoge.sh >> file.txt と実行することにより、出力結
果が file.txt に追記される。
インターリンク株式会社
- 23. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~
3 他コマンドの出力結果を取り込む際のお約束
シェルスクリプトでは、他のコマンドを実行した結果を取り込むこと
ができます。スクリプト内でコマンドを「``」で囲むか「$()」で囲むこと
で実現できます。
例
#!/bin/sh
echo "`date +%Y/%m/%d` $(uptime) "
インターリンク株式会社
- 29. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~
example1
sh-3.2$ cat bin/yum-check 先頭行に「シバン(shebang)」を書き
「これから書くスクリプトは、bashで動
きます」と宣言します。
#!/bin/bash
/usr/bin/yum check-update | ¥
mail -s " `uname -n` `date` YUM CHECK " root@localhost
インターリンク株式会社
- 30. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~
example1
sh-3.2$ cat bin/yum-check yumコマンドの「check-update」オプ
ションで、既にンストールされている
パッケージがupdateリポジトリにあるか
確認する
#!/bin/bash
/usr/bin/yum check-update | ¥
mail -s " `uname -n` `date` YUM CHECK " root@localhost
インターリンク株式会社
- 31. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~
example1
sh-3.2$ cat bin/yum-check yum check-updateコマンドで取得した
ゕップデート有無結果を次のmailコマン
ドに渡しています
#!/bin/bash
/usr/bin/yum check-update | ¥
mail -s " `uname -n` `date` YUM CHECK " root@localhost
インターリンク株式会社
- 36. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~
example2
sh-3.2$ cat bin/yum-check2 ここで環境変数を指定しています。
${HOME} とは、/etc/passwd フゔルに
#!/bin/bash 書かれている、ユーザのホームデゖレク
LOGDIR=${HOME}/logs トリを指しています。
/usr/bin/yum check-update >> ¥
${LOGDIR}/$(date +%Y-%m-%d-%H-%M-%S)_$(basename ${0}).log
インターリンク株式会社
- 37. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~
example2
sh-3.2$ cat bin/yum-check2
「>>」により、yum check-update の結
#!/bin/bash 果をフゔルにリダレクトされます
LOGDIR=${HOME}/logs
/usr/bin/yum check-update >> ¥
${LOGDIR}/$(date +%Y-%m-%d-%H-%M-%S)_$(basename ${0}).log
インターリンク株式会社
- 38. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~
example2
sh-3.2$ cat bin/yum-check2
「$( )」で囲まれたコマンド実行結果を
#!/bin/bash フゔル名にします
LOGDIR=${HOME}/logs
/usr/bin/yum check-update >> ¥
${LOGDIR}/$(date +%Y-%m-%d-%H-%M-%S)_$(basename ${0}).log
インターリンク株式会社
- 43. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~
example2-2 解説 (dateコマンド出力例)
sh-3.2$ date +%Y-%m-%d-%H-%M-%S
2011-04-24-08-40-48
コマンドをバッククォートで囲むこ %Y 4桁の西暦
とで、その部分は実行結果に置き換
わることは先ほど説明しました。 %m ゼロパディングされた月
ここでは、dateコマンドのオプショ %d ゼロパディングされた日付
ンを見てみましょう。右の表にある
%H ゼロパディングされた時間(24h)
以外にもオプションはあるので、
「man date」コマンドを実行して %M ゼロパディングされた分
その他のオプションも応用してみる
のもよいでしょう。 %S ゼロパディングされた秒
インターリンク株式会社
- 52. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~
cat 1つ または 複数のフゔルを出力する
*grep パターンにマッチする行を表示する (grep egrep fgrep)
head フゔルの先頭を表示する (標準で先頭10行)
tail フゔルの末尾を表示する (標準で末尾10行)
wc フゔルのバト数、単語数、行数を表示する
sed 基本的なテキスト置換を行う
awk テキスト整形、置換、計算など非常に多機能なスクリプト言語
cut テキストを切り出す
sort 文字列をソートする
uniq 連続する同じ行を1行にまとめる
インターリンク株式会社
- 66. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~
sample3-1-5
人気コンテンツのトップ10を出力する (重複対応・拡張子指定版)
sh-3.2$ cat bin/example1-5.sh
1 #!/bin/bash
2
3 LOGDIR=/home/logs/blogcube.info/nullpopopo
4 LOGFILE=${LOGDIR}/access_log
5
6 awk '{print $7}' ${LOGFILE} | sed -e 's/¥?.*//g' | ¥
7 egrep -iv '(js$|xml$|jpg$|gif$|png$|css$|ico$|robots.txt$)' | ¥
8 sort | uniq -c | sort -nr | head
インターリンク株式会社
- 69. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~
sample3-1-5
人気コンテンツのトップ10を出力する (重複対応・拡張子指定版)
重複対応・拡張子指定版では
egrep -iv '(js$|xml$|jpg$|gif$|png$|css$|ico$|robots.txt$)' とい
う処理を入れていることで、拡張子がjsで終わるもの、
xmlで終わるもの、以下、JPG、GIF、PNG、CSS、ICO、
そしてrobots.txtを大文字小文字関係なしに除外していま
す。
egrep -i ~~~ ※ 大文字小文字を問わない
egrep -v ~~~ ※ 引数に与えられた文字列を除外する
インターリンク株式会社
- 83. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~
sample3-2-1
デゖスク容量を監視し、CSVフゔルへ記録する
コマンド解説 (sed) - 出力例
sh-3.2$ df -kP | egrep -v '(^Filesystem|/dev/shm$)' | ¥
> sed -e "s/^/$(/bin/date '+%Y¥/%m¥/%d %H:%M:%S') /g;s/¥s¥s*/,/g"
2011/05/22,23:58:13,/dev/mapper/VolGroup00-LogVol00,519423712,159664920,332948016,33%,/
2011/05/22,23:58:13,/dev/vda1,101086,33062,62805,35%,/boot
インターリンク株式会社
- 85. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~
sample3-2-2
メモリ使用量を監視し、CSVフゔルへ記録する
sh-3.2$ cat bin/FREECSV (前半)
1 #!/bin/bash
2 LOGDATE=$(/bin/date '+%Y¥/%m¥/%d %H:%M:%S')
3 LOGDIR=${HOME}/logs
4 LOGFILE=${LOGDIR}/$(basename${0})_$(date +%Y%m%d).csv
5
6 FKMEM=$(free -k | egrep '(^Mem)' | awk '{print $1,$2}')
7 FKPLM=$(free -k | egrep '(^-/+)' | awk '{print $3,$4}')
8
インターリンク株式会社
- 86. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~
sample3-2-2
メモリ使用量を監視し、CSVフゔルへ記録する
sh-3.2$ cat bin/FREECSV (後半)
9 free -k | egrep '(^Mem:)' | awk '{print $1,$2,$3,$4,$5,$6,$7}' | ¥
10 sed -e "s/^/$(echo ${LOGDATE}) /g;s/¥s¥s*/,/g" >> ${LOGFILE}
11
12 free -k | egrep '(^Swap:)' | awk '{print $1,$2,$3,$4}' | ¥
13 sed -e "s/^/$(echo ${LOGDATE}) /g;s/¥s¥s*/,/g" >> ${LOGFILE}
14
15 echo $(echo -n ${FKMEM} ; echo ${FKPLM} | sed -e s/^/" "/g) | ¥
16 sed -e "s/^/$(echo ${LOGDATE}) /g;s/Mem/Total/g;s/¥s¥s*/,/g" >> ${LOGFILE}
インターリンク株式会社
- 89. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~
sample3-2-2
メモリ使用量を監視し、CSVフゔルへ記録する
コマンド解説 (awkで実メモリの表示行を抜き出す) - 出力例
sh-3.2$ LOGDATE=$(/bin/date '+%Y¥/%m¥/%d %H:%M:%S')
sh-3.2$ free -k | egrep '(^Mem:)' | awk '{print $1,$2,$3,$4,$5,$6,$7}' | ¥
> sed -e "s/^/$(echo ${LOGDATE}) /g;s/¥s¥s*/,/g"
2011/05/29,12:39:26,Mem:,509268,351732,157536,0,31228,232560
インターリンク株式会社
- 91. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~
sample3-2-2
メモリ使用量を監視し、CSVフゔルへ記録する
コマンド解説 (メモリの実質消費量 ※別途資料参照) - 出力例
sh-3.2$ LOGDATE=$(/bin/date '+%Y¥/%m¥/%d %H:%M:%S')
sh-3.2$ FKMEM=$(free -k | egrep '(^Mem)' | awk '{print $1,$2}')
sh-3.2$ FKPLM=$(free -k | egrep '(^-/+)' | awk '{print $3,$4}')
sh-3.2$ echo $(echo -n ${FKMEM} ; echo ${FKPLM} | sed -e s/^/" "/g) | ¥
> sed -e "s/^/$(echo ${LOGDATE}) /g;s/Mem/Total/g;s/¥s¥s*/,/g"
2011/05/29,13:59:03,Total:,509268,88128,421140
インターリンク株式会社
- 93. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~
sample3-2-2
メモリ使用量を監視し、CSVフゔルへ記録する
変数解説 - FKPLM -
sh-3.2$ FKPLM=$(free -k | egrep '(^-/+)' | awk '{print $3,$4}')
sh-3.2$ echo ${FKPLM}
88268 421000
freeコマンドの出力結果より、メモリの「usedからバッフゔ
キャッシュ( buffers )・フゔルキャッシュ( cached )を差し
引いた量(内容を捨てるわけにいかないメモリ)と、freeにバッ
フゔキャッシュ・フゔルキャッシュを加えた量(必要があれ
ば使えるメモリ)を切り出した結果。
インターリンク株式会社
- 94. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~
sample3-2-2
メモリ使用量を監視し、CSVフゔルへ記録する
コマンド解説 (メモリの実質消費量ログフゔル) - 出力例
sh-3.2$ grep Total ${HOME}/logs/FREECSV_20110529.csv | tail
2011/05/29,13:35:01,Total:,509268,91380,417888
2011/05/29,13:40:02,Total:,509268,90864,418404 実メモリ総容量
2011/05/29,13:45:01,Total:,509268,90244,419024
2011/05/29,13:50:01,Total:,509268,88956,420312
2011/05/29,13:55:01,Total:,509268,88848,420420
2011/05/29,14:00:02,Total:,509268,89196,420072
2011/05/29,14:05:01,Total:,509268,91280,417988
2011/05/29,14:10:02,Total:,509268,89772,419496
2011/05/29,14:15:01,Total:,509268,90088,419180
2011/05/29,14:20:01,Total:,509268,92896,416372
インターリンク株式会社
- 95. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~
sample3-2-2
メモリ使用量を監視し、CSVフゔルへ記録する
コマンド解説 (メモリの実質消費量ログフゔル) - 出力例
sh-3.2$ grep Total ${HOME}/logs/FREECSV_20110529.csv | tail
2011/05/29,13:35:01,Total:,509268,91380,417888
2011/05/29,13:40:02,Total:,509268,90864,418404
2011/05/29,13:45:01,Total:,509268,90244,419024
2011/05/29,13:50:01,Total:,509268,88956,420312
2011/05/29,13:55:01,Total:,509268,88848,420420 メモリ使用量
※ バッフゔとキャッシュを含まず
2011/05/29,14:00:02,Total:,509268,89196,420072
2011/05/29,14:05:01,Total:,509268,91280,417988
2011/05/29,14:10:02,Total:,509268,89772,419496
2011/05/29,14:15:01,Total:,509268,90088,419180
2011/05/29,14:20:01,Total:,509268,92896,416372
インターリンク株式会社
- 96. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~
sample3-2-2
メモリ使用量を監視し、CSVフゔルへ記録する
コマンド解説 (メモリの実質消費量ログフゔル) - 出力例
sh-3.2$ grep Total ${HOME}/logs/FREECSV_20110529.csv | tail
2011/05/29,13:35:01,Total:,509268,91380,417888
2011/05/29,13:40:02,Total:,509268,90864,418404
2011/05/29,13:45:01,Total:,509268,90244,419024
2011/05/29,13:50:01,Total:,509268,88956,420312
2011/05/29,13:55:01,Total:,509268,88848,420420
2011/05/29,14:00:02,Total:,509268,89196,420072
2011/05/29,14:05:01,Total:,509268,91280,417988
2011/05/29,14:10:02,Total:,509268,89772,419496 空きメモリ
2011/05/29,14:15:01,Total:,509268,90088,419180 ※ バッフゔとキャッシュを含む
2011/05/29,14:20:01,Total:,509268,92896,416372
インターリンク株式会社
- 97. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~
sample3-2-3
ロードゕベレージを監視し、CSVフゔルへ記録する
sh-3.2$ cat bin/LACSV
1 #!/bin/bash
2 LOGDATE=$(/bin/date '+%Y¥/%m¥/%d %H:%M:%S')
3 LOGDIR=${HOME}/logs
4 LOGFILE=${LOGDIR}/$(basename${0})_$(date +%Y%m%d).csv
5
6 uptime | awk 'BEGIN {FS="load average:"} {print $NF}' | ¥
7 sed -e "s/^/$(echo ${LOGDATE}) /g;s/¥s¥s*/,/g;s/,,/,/g" >> ${LOGFILE}
インターリンク株式会社
- 100. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~
sample3-2-3
ロードゕベレージを監視し、CSVフゔルへ記録する
コマンド解説 (uptimeコマンド) - 出力例
sh-3.2$ uptime
15:51:53 up 20 days, 14:22, 1 user, load average: 0.07, 0.09, 0.08
コマンド解説 (uptimeコマンドからロードゕベレージを抜き出す) - 出力例
sh-3.2$ uptime | awk 'BEGIN {FS="load average:"} {print $NF}'
文字列
最後のフゖールドを
「load average:」を
0.07, 0.09, 0.08 表示する
区切り文字に指定する
インターリンク株式会社
- 101. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~
sample3-2-3
ロードゕベレージを監視し、CSVフゔルへ記録する
コマンド解説 (メモリの実質消費量ログフゔル) - 出力例
sh-3.2$ tail ${HOME}/logs/LACSV_20110529.csv
2011/05/29,18:00:01,0.56,0.17,0.11 1分間の run queue(CPUに割り当て
2011/05/29,18:05:01,0.58,0.19,0.12 られたジョブが入る待ち行列)にある
2011/05/29,18:10:02,0.64,0.19,0.12 ジョブ数平均値
2011/05/29,18:15:01,0.40,0.15,0.10
2011/05/29,18:20:02,0.72,0.20,0.12
2011/05/29,18:25:02,0.56,0.18,0.11
2011/05/29,18:30:02,0.51,0.19,0.12
2011/05/29,18:35:01,0.48,0.17,0.11
2011/05/29,18:40:02,0.56,0.17,0.11
2011/05/29,18:45:01,0.49,0.16,0.11
インターリンク株式会社
- 102. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~
sample3-2-3
ロードゕベレージを監視し、CSVフゔルへ記録する
コマンド解説 (メモリの実質消費量ログフゔル) - 出力例
sh-3.2$ tail ${HOME}/logs/LACSV_20110529.csv
2011/05/29,18:00:01,0.56,0.17,0.11
2011/05/29,18:05:01,0.58,0.19,0.12
2011/05/29,18:10:02,0.64,0.19,0.12
2011/05/29,18:15:01,0.40,0.15,0.10
5分間の run queue(CPUに割り当て
2011/05/29,18:20:02,0.72,0.20,0.12 られたジョブが入る待ち行列)にある
2011/05/29,18:25:02,0.56,0.18,0.11 ジョブ数平均値
2011/05/29,18:30:02,0.51,0.19,0.12
2011/05/29,18:35:01,0.48,0.17,0.11
2011/05/29,18:40:02,0.56,0.17,0.11
2011/05/29,18:45:01,0.49,0.16,0.11
インターリンク株式会社
- 103. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~
sample3-2-3
ロードゕベレージを監視し、CSVフゔルへ記録する
コマンド解説 (メモリの実質消費量ログフゔル) - 出力例
sh-3.2$ tail ${HOME}/logs/LACSV_20110529.csv
2011/05/29,18:00:01,0.56,0.17,0.11
2011/05/29,18:05:01,0.58,0.19,0.12
2011/05/29,18:10:02,0.64,0.19,0.12
2011/05/29,18:15:01,0.40,0.15,0.10
2011/05/29,18:20:02,0.72,0.20,0.12
2011/05/29,18:25:02,0.56,0.18,0.11
2011/05/29,18:30:02,0.51,0.19,0.12
2011/05/29,18:35:01,0.48,0.17,0.11 15分間の run queue(CPUに割り当て
2011/05/29,18:40:02,0.56,0.17,0.11 られたジョブが入る待ち行列)にある
2011/05/29,18:45:01,0.49,0.16,0.11 ジョブ数平均値
インターリンク株式会社
- 106. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~
1 同じ列に複数の項目が並んでいるので、DFCSVや
FREECSVをグラフ化するのが面倒 だ。
2 *CSVスクリプトでほとんどの変数が共通なので、
これらを関数化できないか?
3 監視項目の閾値を超えたときにメール発報したい。
4 ログの先頭に項目名をつけたい。
インターリンク株式会社