Ilstudy001_20110806

1,275 views

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,275
On SlideShare
0
From Embeds
0
Number of Embeds
221
Actions
Shares
0
Downloads
3
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Ilstudy001_20110806

  1. 1. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ インターリンク株式会社 ICTサービス事業部 ネットワーク課 濱田 康貴 インターリンク株式会社
  2. 2. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~自己紹介名前: 濱田 康貴 (はまだ やすたか)所属: インターリンク株式会社 http://www.interlink.ne.jp/職業: インフラエンジニア趣味: Linux、自転車、勉強会参加とか運営とか7つ道具: vim bash パワポ netstat ps grep awk将来の夢: GEEK団地(データセンタ併設住宅) 建設 インターリンク株式会社
  3. 3. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~今日のおしながき1. シェルスクリプトの基礎知識 ~ どんなことができるの? ~2. シェルスクリプトのおやくそく3-1. テキスト処理の効率化とログ解析サンプル3-2. 簡単なルーチンワークと監視プログラム4. 質疑応答5. 懇親会 (希望者のみ) インターリンク株式会社
  4. 4. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ 1. シェルスクリプトの基礎知識 ~ どんなことができるの? ~ インターリンク株式会社
  5. 5. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ シェルって何? インターリンク株式会社
  6. 6. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ shell = 貝殻? インターリンク株式会社
  7. 7. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~• シェル(殻)とは、ユーザから入力されたコマンドを解釈し、プロ グラムを起動するアプリケーションであり、OSの機能を実装してい るカーネル(中心核)を貝殻のように覆うようにして動作する。 今何時かな? shell date 命令応答 Unix Linux Kernel Thu Apr 21 11:53:44 JST 2011 インターリンク株式会社
  8. 8. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ カーネルと シェルの 役割 インターリンク株式会社
  9. 9. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ カーネルのおしごと 1. シェルから渡されたコンピュータへの命令を実行する 2. CPUに計算させたりメモリに一時記憶したりハードディスクや SSDに記録したり・・・ インターリンク株式会社
  10. 10. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~シェルのおしごと 1. ユーザが入力したコマンドをカーネルに伝える(シェルは人の命 令を仲介しOSに実行させる) 2. プログラムを終了させたり、フォアグラウンド・バックグラウンドを 切り替えたりする 3. まとまった一連の入力をシェルスクリプトとして実行する 4. プログラムの出力をファイルにリダイレクトしたり、パイプに 渡すことで他のプログラムの入力としたりする 5. 変数や他のコマンドの出力結果を取り込んで加工し、出力 する インターリンク株式会社
  11. 11. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~シェルスクリプトで何ができるの? - コマンドを並べて順に実行する - リダイレクトを使ってコマンド実行結果をファイルに書きだす - パイプを使って次のコマンドに出力結果を渡す (コマンド実行結果をメールで飛ばすなど) - シェルスクリプトをcron実行することで、定時作業の省力化が できるなど、作業品質の一定化と省力化を図ることができます。 インターリンク株式会社
  12. 12. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~シェルスクリプトってどうやって書くの? - シェルスクリプトを動かしたいコンピュータへSSHやtelnetなどで ログインし、viなどのエディタを使ってシェルスクリプトを書く - 手元のコンピュータでシェルスクリプトを書いてFTPやSCPなど を使い、シェルスクリプトを動かしたいコンピュータへアップロード する (文字コードや改行コードの違いに注意) - chmodコマンドを使い書き終わったシェルスクリプトへ実行権を つけて実行する インターリンク株式会社
  13. 13. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ 2. シェルスクリプトのおやくそく インターリンク株式会社
  14. 14. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~シェルスクリプトには、いくつか約束ごとがあります。 1 シェルスクリプトを書いて実行する際のお約束 2 出力結果をリダイレクトする際のお約束 3 他コマンドの出力結果を取り込む際のお約束 4 変数を設定する際のお約束 インターリンク株式会社
  15. 15. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~1 シェルスクリプトを書いて実行する際のお約束シェルスクリプトの先頭1行目には、スクリプトを読み込むインタプリタを「#!」から始まる書き出しで記述します。 例) これらを「シバン (she- #!/bin/sh bang)」と呼びます #!/bin/bash #!/bin/csh インターリンク株式会社
  16. 16. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~シェルスクリプト内でコメントアウトするときは「#」を使います。 例) #!/bin/sh ← これはコメント行ではありません # ここで変数を設定する 赤く囲った箇所 (#より右側)は hoge=fuga 実行されません # 変数「hoge」を表示させる echo ${hoge} # ← fugaと表示される インターリンク株式会社
  17. 17. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~シェルスクリプトを動かすために、実行権をつけるか sh コマンドの引数にスクリプトの名前を渡してあげる必要があります。スクリプトに実行権をつけるにはchmod 755 hoge.shのように、chmodコマンドで実行権を付与します。 インターリンク株式会社
  18. 18. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~実行権がないシェルスクリプトを実行しようとするとこうなります。sh-3.2$ cat bin/hoge.sh#!/bin/bashbasename ${0}sh-3.2$ ls -l bin/hoge.sh-rw-r--r-- 1 oresama oresama 26 May 11 15:33 bin/hoge.shsh-3.2$ hoge.shsh: /home/oresama/bin/hoge.sh: Permission denied インターリンク株式会社
  19. 19. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~シェルスクリプトを実行するには2つの方法があります。sh-3.2$ cat bin/hoge.sh#!/bin/bash 実行権をつけるbasename ${0}sh-3.2$ chmod 755 bin/hoge.shsh-3.2$ ls -l bin/hoge.sh-rwxr-xr-x 1 oresama oresama 26 May 11 15:33 bin/hoge.shsh-3.2$ hoge.shhoge.sh インターリンク株式会社
  20. 20. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~シェルスクリプトを実行するには2つの方法があります。sh-3.2$ cat bin/hoge.sh#!/bin/bashbasename ${0} 実行権 (x) がついていないsh-3.2$ ls -l bin/hoge.sh-rw-r--r-- 1 oresama oresama 26 May 11 15:33 bin/hoge.shsh-3.2$ sh hoge.shhoge.sh インターリンク株式会社
  21. 21. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~2 出力結果をリダイレクトする際のお約束シェルスクリプトの出力結果は、標準出力または標準エラー出力に表示されます。ファイルやコマンドにリダイレクトしない場合は、コンソールやSSHクライアントに表示されます。シェルスクリプトのリダイレクトは、主に次の3つを使います。 インターリンク株式会社
  22. 22. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~| 「パイプ」と呼ばれる。パイプ左辺で実行されたコマンドを パイプ右辺のコマンドへ渡す役割を担う。> hoge.sh > file.txt と実行することにより、出力結果 が file.txt に上書きされる。>> hoge.sh >> file.txt と実行することにより、出力結 果が file.txt に追記される。 インターリンク株式会社
  23. 23. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~3 他コマンドの出力結果を取り込む際のお約束シェルスクリプトでは、他のコマンドを実行した結果を取り込むことができます。スクリプト内でコマンドを「``」で囲むか「$()」で囲むことで実現できます。例#!/bin/shecho "`date +%Y/%m/%d` $(uptime) " インターリンク株式会社
  24. 24. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~4 変数を設定する際のお約束シェルスクリプトで変数を設定する際、以下の文法で行います。hoge=fuga※ 「=」の両側にスペースをあけないでください インターリンク株式会社
  25. 25. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~変数に格納された値を参照する際、変数の先頭に「$」をつけます。sh-3.2$ hoge=fugash-3.2$ echo ${hoge}fuga インターリンク株式会社
  26. 26. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~※ シェル変数についてシェルスクリプト中で使うと便利な変数を、付録「付帯資料 #1 シェル変数」にまとめました。スクリプト名などを決め打ちで書くよりも保守性が高くなりますので、非常に便利です。 インターリンク株式会社
  27. 27. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~簡単な実例 インターリンク株式会社
  28. 28. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~example1「CentOSでrpmパッケージの更新をyumコマンドで確認し、その結果をroot宛にメールする」 インターリンク株式会社
  29. 29. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~example1sh-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. 30. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~example1sh-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. 31. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~example1sh-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 インターリンク株式会社
  32. 32. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~example1sh-3.2$ cat bin/yum-check コマンドの1行が長くなる場合、「¥」で 折り返すことができます#!/bin/bash/usr/bin/yum check-update | ¥mail -s " `uname -n` `date` YUM CHECK " root@localhost インターリンク株式会社
  33. 33. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~example1sh-3.2$ cat bin/yum-check バッククォートで文字列をくくると、そ の中をコマンドとして実行し、標準出力 に出力されます#!/bin/bash/usr/bin/yum check-update | ¥mail -s " `uname -n` `date` YUM CHECK " root@localhost インターリンク株式会社
  34. 34. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~example1sh-3.2$ cat bin/yum-check バッククォートで文字列をくくると、そ の中をコマンドとして実行し、標準出力 に出力されます#!/bin/bash/usr/bin/yum check-update | ¥mail -s " `uname -n` `date` YUM CHECK " root@localhost インターリンク株式会社
  35. 35. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~example2「CentOSでrpmパッケージの更新をyumコマンドで確認し、その結果をログファイルに残す」 インターリンク株式会社
  36. 36. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~example2sh-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. 37. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~example2sh-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. 38. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~example2sh-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 インターリンク株式会社
  39. 39. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~でも、よくわかんないですよね? インターリンク株式会社
  40. 40. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~example2sh-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 インターリンク株式会社
  41. 41. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~example2sh-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 インターリンク株式会社
  42. 42. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~こういうときは、バッククォートや$( ) に囲まれたコマンドをじっくり観察します インターリンク株式会社
  43. 43. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~example2-2 解説 (dateコマンド出力例)sh-3.2$ date +%Y-%m-%d-%H-%M-%S2011-04-24-08-40-48コマンドをバッククォートで囲むこ %Y 4桁の西暦とで、その部分は実行結果に置き換わることは先ほど説明しました。 %m ゼロパディングされた月ここでは、dateコマンドのオプショ %d ゼロパディングされた日付ンを見てみましょう。右の表にある %H ゼロパディングされた時間(24h)以外にもオプションはあるので、「man date」コマンドを実行して %M ゼロパディングされた分その他のオプションも応用してみるのもよいでしょう。 %S ゼロパディングされた秒 インターリンク株式会社
  44. 44. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~example2-3 解説 (basenameコマンドを使ってみる例 1) 変数 ${HOME} は /home/test1 というディレクトリ名に 展開される catコマンドで シェルスクリプトの 中身を見てみる シェルスクリプト「hoge」を 実行すると、画面に 「hoge」と表示される インターリンク株式会社
  45. 45. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~example2-3 解説 (basenameコマンドを使ってみる例 2) hoge を fuga に リネームしてみる catコマンドで シェルスクリプトの 中身を見てみる シェルスクリプト「fuga」を 実行すると、画面に 「fuga」と表示される インターリンク株式会社
  46. 46. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ ここまでのまとめ インターリンク株式会社
  47. 47. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ インターリンク株式会社
  48. 48. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ みんな、わかったカナ? リンくまは、ちょっと 疲れちゃったなー。 少し休憩しようよー。 インターリンク株式会社
  49. 49. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ 3-1. テキスト処理の効率化とログ解析サンプル インターリンク株式会社
  50. 50. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~sample3-1テキスト処理の効率化とログ解析サンプル~Apacheのゕクセスログを見てみよう~ インターリンク株式会社
  51. 51. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~シェルスクリプトは手軽にテキスト処理を行うことができます。次のページに示すコマンドを押さえておくことで、多様な処理が可能になるでしょう。 インターリンク株式会社
  52. 52. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~cat 1つ または 複数のフゔ゗ルを出力する*grep パターンにマッチする行を表示する (grep egrep fgrep)head フゔ゗ルの先頭を表示する (標準で先頭10行)tail フゔ゗ルの末尾を表示する (標準で末尾10行)wc フゔ゗ルのバ゗ト数、単語数、行数を表示するsed 基本的なテキスト置換を行うawk テキスト整形、置換、計算など非常に多機能なスクリプト言語cut テキストを切り出すsort 文字列をソートするuniq 連続する同じ行を1行にまとめる インターリンク株式会社
  53. 53. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~sample3-1-1WEBサーバに接続しにきたクラ゗ゕント一覧を出力するsh-3.2$ cat bin/example1-1.sh1 #!/bin/bash23 LOGDIR=/home/logs/blogcube.info/nullpopopo4 LOGFILE=${LOGDIR}/access_log56 awk {print $1} ${LOGFILE} | sort | uniq -c | sort -n インターリンク株式会社
  54. 54. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~sample3-1-1WEBサーバに接続しにきたクラ゗ゕント一覧を出力するスクリプト中で使っているコマンド awk # テキストの特定の列を抜き出す sort # テキストの並べかえを行う uniq # 重複を除外する インターリンク株式会社
  55. 55. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~sample3-1-1WEBサーバに接続しにきたクラ゗ゕント一覧を出力する インターリンク株式会社
  56. 56. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~sample3-1-2WEBサーバに接続しにきたクラ゗ゕントのトップ10を出力するsh-3.2$ cat bin/example1-2.sh1 #!/bin/bash23 LOGDIR=/home/logs/blogcube.info/nullpopopo4 LOGFILE=${LOGDIR}/access_log56 awk {print $1} ${LOGFILE} | sort | ¥7 uniq -c | sort -nr | head インターリンク株式会社
  57. 57. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~sample3-1-2WEBサーバに接続しにきたクラ゗ゕントのトップ10を出力するスクリプト中で使っているコマンド awk # 特定の列を抜き出す sort # 並べかえを行う uniq # 重複を除外する head # 先頭行を表示する インターリンク株式会社
  58. 58. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~sample3-1-2WEBサーバに接続しにきたクラ゗ゕントのトップ10を出力する インターリンク株式会社
  59. 59. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~sample3-1-3人気コンテンツのトップ10を出力するsh-3.2$ cat bin/example1-3.sh1 #!/bin/bash23 LOGDIR=/home/logs/blogcube.info/nullpopopo4 LOGFILE=${LOGDIR}/access_log56 awk {print $7} ${LOGFILE} | sort | ¥7 uniq -c | sort -nr | head インターリンク株式会社
  60. 60. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~sample3-1-3人気コンテンツのトップ10を出力するスクリプト中で使っているコマンド awk # 特定の列を抜き出す sort # 並べかえを行う uniq # 重複を除外する head # 先頭行を表示する インターリンク株式会社
  61. 61. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~sample3-1-3人気コンテンツのトップ10を出力する インターリンク株式会社
  62. 62. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~sample3-1-4人気コンテンツのトップ10を出力する (重複対応版)sh-3.2$ cat bin/example1-4.sh1 #!/bin/bash23 LOGDIR=/home/logs/blogcube.info/nullpopopo4 LOGFILE=${LOGDIR}/access_log56 awk {print $7} ${LOGFILE} | sed -e s/¥?.*//g | ¥7 sort | uniq -c | sort -nr | head インターリンク株式会社
  63. 63. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~sample3-1-4人気コンテンツのトップ10を出力する (重複対応版)スクリプト中で使っているコマンド sed # 文字列を置換する awk # 特定の列を抜き出す sort # 並べかえを行う uniq # 重複を除外する head # 先頭行を表示する インターリンク株式会社
  64. 64. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~sample3-1-4人気コンテンツのトップ10を出力する (重複対応版) インターリンク株式会社
  65. 65. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~sample3-1-4人気コンテンツのトップ10を出力する (重複対応版)重複対応版では sed -e s/¥?.*//g という処理を入れていることで、URLの後ろにくっついている?以降の文字列を正規表現で削除し、同じURLとしてカウントします。例)http://nullpopopo.blogcube.info/http://nullpopopo.blogcube.info/?p=142 インターリンク株式会社
  66. 66. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~sample3-1-5人気コンテンツのトップ10を出力する (重複対応・拡張子指定版)sh-3.2$ cat bin/example1-5.sh1 #!/bin/bash23 LOGDIR=/home/logs/blogcube.info/nullpopopo4 LOGFILE=${LOGDIR}/access_log56 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 インターリンク株式会社
  67. 67. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~sample3-1-5人気コンテンツのトップ10を出力する (重複対応・拡張子指定版)スクリプト中で使っているコマンド awk # 特定の列を抜き出す egrep # 特定文字列を含む行を抜き出す sort # 並べかえを行う uniq # 重複を除外する head # 先頭行を表示する インターリンク株式会社
  68. 68. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~sample3-1-5人気コンテンツのトップ10を出力する (重複対応・拡張子指定版) インターリンク株式会社
  69. 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 ~~~ ※ 引数に与えられた文字列を除外する インターリンク株式会社
  70. 70. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ 3-2. 簡単なルーチンワークと監視プログラム インターリンク株式会社
  71. 71. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~sample3-2簡単なルーチンワークと監視プログラム~サーバの監視をしてみよう~ インターリンク株式会社
  72. 72. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~sample3-2-1デゖスク容量を監視し、CSVフゔ゗ルへ記録するsh-3.2$ cat bin/DFCSV 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 df -kP | egrep -v (^Filesystem|/dev/shm$) | ¥ 7 sed -e "s/^/$(echo ${LOGDATE}) /g;s/¥s¥s*/,/g" >> ¥ 8 ${LOGFILE} インターリンク株式会社
  73. 73. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~sample3-2-1デゖスク容量を監視し、CSVフゔ゗ルへ記録するスクリプト中で使っているコマンド basename # コマンドのフルパスから デゖレクトリを除いて表示する date # 時刻を表示する df # デゖスク容量を表示する egrep # 特定文字列を含む行を抜き出す sed # 文字列を置換する インターリンク株式会社
  74. 74. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~sample3-2-1デゖスク容量を監視し、CSVフゔ゗ルへ記録するLOGDATE=$(/bin/date +%Y¥/%m¥/%d %H:%M:%S)変数「LOGDATE」に、dateコマンドで YYYY/MM/DD HH:MM:SS 形式の日付を代入します。実際にコンソール上で「/bin/date +%Y¥/%m¥/%d %H:%M:%S」を実行してみることで、どのように出力されるか事前に確認するとよいでしょう。例)sh-3.2$ /bin/date +%Y¥/%m¥/%d %H:%M:%S2011¥/05¥/22 22:57:48 インターリンク株式会社
  75. 75. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~sample3-2-1デゖスク容量を監視し、CSVフゔ゗ルへ記録するLOGDIR=${HOME}/logs変数「LOGDIR」には、シェル変数「${HOME}/logs」が代入されます。変数${HOME}に何が代入されるかは、以下のコマンドで確認することができます。例)sh-3.2$ echo ${HOME}/home/oresama インターリンク株式会社
  76. 76. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~sample3-2-1デゖスク容量を監視し、CSVフゔ゗ルへ記録するLOGFILE=${LOGDIR}/$(basename ${0})_$(date +%Y%m%d).csv変数「LOGDIR」は、/home/oresama/logs デゖレクトリであることがわかりました。変数「$(basename ${0})」は、実行したスクリプト自身の名前になります。basename コマンドをつけているのは、「sh DFCSV 」で実行した際に、意図せぬフゔ゗ル名にならないようにするためです。スクリプトの名前が「DFCSV」だとして、ログフゔ゗ルは以下に出力されます。 /home/oresama/logs/DFCSV_20110529.csv インターリンク株式会社
  77. 77. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~sample3-2-1デゖスク容量を監視し、CSVフゔ゗ルへ記録するコマンド解説 (df)dfコマンドのオプションは以下の通りです。 -k 容量をキロバ゗ト単位で表示する。 フゔ゗ルシステムの情報を常に1行で表示させるため、POSIX出力形式を用 -P いる。LVMのボリューム配下やNFSマウントされている領域で改行されない。 インターリンク株式会社
  78. 78. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~sample3-2-1デゖスク容量を監視し、CSVフゔ゗ルへ記録する コマンド解説 (df) - 出力例sh-3.2$ df -kPFilesystem 1024-blocks Used Available Capacity Mounted on/dev/mapper/VolGroup00-LogVol00 519423712 159664828 332948108 33% //dev/vda1 101086 33062 62805 35% /boottmpfs 254632 0 254632 0% /dev/shm インターリンク株式会社
  79. 79. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~sample3-2-1デゖスク容量を監視し、CSVフゔ゗ルへ記録する コマンド解説 (df) - 出力例sh-3.2$ df -kFilesystem 1K-blocks Used Available Use% Mounted on/dev/mapper/VolGroup00-LogVol00 519423712 159664828 332948108 33% //dev/vda1 101086 33062 62805 35% /boottmpfs 254632 0 254632 0% /dev/shm インターリンク株式会社
  80. 80. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~sample3-2-1デゖスク容量を監視し、CSVフゔ゗ルへ記録するコマンド解説 (egrep)egrep -v (^Filesystem|/dev/shm$)で、先頭が「 Filesystem」の行と「/dev/shm」で終わる行を表示しないようにしています。 インターリンク株式会社
  81. 81. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~sample3-2-1デゖスク容量を監視し、CSVフゔ゗ルへ記録する コマンド解説 (egrep) - 出力例sh-3.2$ df -kP | egrep -v (^Filesystem|/dev/shm$)/dev/mapper/VolGroup00-LogVol00 519423712 159664892 332948044 33% //dev/vda1 101086 33062 62805 35% /boot インターリンク株式会社
  82. 82. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~sample3-2-1デゖスク容量を監視し、CSVフゔ゗ルへ記録するコマンド解説 (sed)sed -e "s/^/$(echo ${LOGDATE}) /g;s/¥s¥s*/,/g"で、先頭出力結果の先頭を日付に、連続したスペースをカンマに置換しています。複数回のsedは、以下のようにまとめることができます。sed -e "s/hoge/fuga/g;s/ABC/DEF/g"( sed -e "s/hoge/fuga/g" | sed -e "s/ABC/DEF/g" と同じ出力結果) インターリンク株式会社
  83. 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 インターリンク株式会社
  84. 84. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~sample3-2-1デゖスク容量を監視し、CSVフゔ゗ルへ記録するログ(CSVフゔ゗ル) 出力例 インターリンク株式会社
  85. 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. 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}1112 free -k | egrep (^Swap:) | awk {print $1,$2,$3,$4} | ¥13 sed -e "s/^/$(echo ${LOGDATE}) /g;s/¥s¥s*/,/g" >> ${LOGFILE}1415 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} インターリンク株式会社
  87. 87. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~sample3-2-2メモリ使用量を監視し、CSVフゔ゗ルへ記録するスクリプト中で使っているコマンド date # 時刻を表示する basename # コマンドのフルパスから デゖレクトリを除いて表示する free # メモリ使用量を表示する egrep # 特定文字列を含む行を抜き出す awk # 特定の列を抜き出す echo # 文字列を表示する インターリンク株式会社
  88. 88. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~sample3-2-2メモリ使用量を監視し、CSVフゔ゗ルへ記録する コマンド解説 (free -k) - 出力例sh-3.2$ free -k total used free shared buffers cachedMem: 509268 356712 152556 0 35864 233108-/+ buffers/cache: 87740 421528Swap: 524280 68 524212 インターリンク株式会社
  89. 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 インターリンク株式会社
  90. 90. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~sample3-2-2メモリ使用量を監視し、CSVフゔ゗ルへ記録する コマンド解説 (awkでSWAPの行を抜き出す) - 出力例sh-3.2$ LOGDATE=$(/bin/date +%Y¥/%m¥/%d %H:%M:%S)sh-3.2$ free -k | egrep (^Swap:) | awk {print $1,$2,$3,$4} | ¥> sed -e "s/^/$(echo ${LOGDATE}) /g;s/¥s¥s*/,/g"2011/05/29,13:51:35,Swap:,524280,68,524212 インターリンク株式会社
  91. 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 インターリンク株式会社
  92. 92. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~sample3-2-2メモリ使用量を監視し、CSVフゔ゗ルへ記録する 変数解説 - FKMEM -sh-3.2$ FKMEM=$(free -k | egrep (^Mem) | awk {print $1,$2})sh-3.2$ echo ${FKMEM}Mem: 509268 freeコマンドの出力結果より、実メモリの総容量(egrepで先頭 がMemである行)を抜き出し、1フゖールド目と2フゖールド目を 切り出した結果。 ゗ンターリンク株式会社
  93. 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. 94. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~sample3-2-2メモリ使用量を監視し、CSVフゔ゗ルへ記録する コマンド解説 (メモリの実質消費量ログフゔ゗ル) - 出力例sh-3.2$ grep Total ${HOME}/logs/FREECSV_20110529.csv | tail2011/05/29,13:35:01,Total:,509268,91380,4178882011/05/29,13:40:02,Total:,509268,90864,418404 実メモリ総容量2011/05/29,13:45:01,Total:,509268,90244,4190242011/05/29,13:50:01,Total:,509268,88956,4203122011/05/29,13:55:01,Total:,509268,88848,4204202011/05/29,14:00:02,Total:,509268,89196,4200722011/05/29,14:05:01,Total:,509268,91280,4179882011/05/29,14:10:02,Total:,509268,89772,4194962011/05/29,14:15:01,Total:,509268,90088,4191802011/05/29,14:20:01,Total:,509268,92896,416372 インターリンク株式会社
  95. 95. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~sample3-2-2メモリ使用量を監視し、CSVフゔ゗ルへ記録する コマンド解説 (メモリの実質消費量ログフゔ゗ル) - 出力例sh-3.2$ grep Total ${HOME}/logs/FREECSV_20110529.csv | tail2011/05/29,13:35:01,Total:,509268,91380,4178882011/05/29,13:40:02,Total:,509268,90864,4184042011/05/29,13:45:01,Total:,509268,90244,4190242011/05/29,13:50:01,Total:,509268,88956,4203122011/05/29,13:55:01,Total:,509268,88848,420420 メモリ使用量 ※ バッフゔとキャッシュを含まず2011/05/29,14:00:02,Total:,509268,89196,4200722011/05/29,14:05:01,Total:,509268,91280,4179882011/05/29,14:10:02,Total:,509268,89772,4194962011/05/29,14:15:01,Total:,509268,90088,4191802011/05/29,14:20:01,Total:,509268,92896,416372 インターリンク株式会社
  96. 96. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~sample3-2-2メモリ使用量を監視し、CSVフゔ゗ルへ記録する コマンド解説 (メモリの実質消費量ログフゔ゗ル) - 出力例sh-3.2$ grep Total ${HOME}/logs/FREECSV_20110529.csv | tail2011/05/29,13:35:01,Total:,509268,91380,4178882011/05/29,13:40:02,Total:,509268,90864,4184042011/05/29,13:45:01,Total:,509268,90244,4190242011/05/29,13:50:01,Total:,509268,88956,4203122011/05/29,13:55:01,Total:,509268,88848,4204202011/05/29,14:00:02,Total:,509268,89196,4200722011/05/29,14:05:01,Total:,509268,91280,4179882011/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. 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} インターリンク株式会社
  98. 98. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~sample3-2-3ロードゕベレージを監視し、CSVフゔ゗ルへ記録するスクリプト中で使っているコマンド date # 時刻を表示する basename # コマンドのフルパスから デゖレクトリを除いて表示する uptime # コンピュータの起動経過時刻を表示する awk # 特定の列を抜き出す sed # 文字列を置換する インターリンク株式会社
  99. 99. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~sample3-2-3ロードゕベレージを監視し、CSVフゔ゗ルへ記録する コマンド解説 (uptimeコマンド) - 出力例sh-3.2$ uptime15: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}0.07, 0.09, 0.08 インターリンク株式会社
  100. 100. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~sample3-2-3ロードゕベレージを監視し、CSVフゔ゗ルへ記録する コマンド解説 (uptimeコマンド) - 出力例sh-3.2$ uptime15: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. 101. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~sample3-2-3ロードゕベレージを監視し、CSVフゔ゗ルへ記録する コマンド解説 (メモリの実質消費量ログフゔ゗ル) - 出力例sh-3.2$ tail ${HOME}/logs/LACSV_20110529.csv2011/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.102011/05/29,18:20:02,0.72,0.20,0.122011/05/29,18:25:02,0.56,0.18,0.112011/05/29,18:30:02,0.51,0.19,0.122011/05/29,18:35:01,0.48,0.17,0.112011/05/29,18:40:02,0.56,0.17,0.112011/05/29,18:45:01,0.49,0.16,0.11 インターリンク株式会社
  102. 102. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~sample3-2-3ロードゕベレージを監視し、CSVフゔ゗ルへ記録する コマンド解説 (メモリの実質消費量ログフゔ゗ル) - 出力例sh-3.2$ tail ${HOME}/logs/LACSV_20110529.csv2011/05/29,18:00:01,0.56,0.17,0.112011/05/29,18:05:01,0.58,0.19,0.122011/05/29,18:10:02,0.64,0.19,0.122011/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.122011/05/29,18:35:01,0.48,0.17,0.112011/05/29,18:40:02,0.56,0.17,0.112011/05/29,18:45:01,0.49,0.16,0.11 インターリンク株式会社
  103. 103. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~sample3-2-3ロードゕベレージを監視し、CSVフゔ゗ルへ記録する コマンド解説 (メモリの実質消費量ログフゔ゗ル) - 出力例sh-3.2$ tail ${HOME}/logs/LACSV_20110529.csv2011/05/29,18:00:01,0.56,0.17,0.112011/05/29,18:05:01,0.58,0.19,0.122011/05/29,18:10:02,0.64,0.19,0.122011/05/29,18:15:01,0.40,0.15,0.102011/05/29,18:20:02,0.72,0.20,0.122011/05/29,18:25:02,0.56,0.18,0.112011/05/29,18:30:02,0.51,0.19,0.122011/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 ジョブ数平均値 インターリンク株式会社
  104. 104. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~sample3-2-3ロードゕベレージを監視し、CSVフゔ゗ルへ記録するログ(CSVフゔ゗ル) 出力例 インターリンク株式会社
  105. 105. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ 課題 インターリンク株式会社
  106. 106. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~1 同じ列に複数の項目が並んでいるので、DFCSVや FREECSVをグラフ化するのが面倒 だ。2 *CSVスクリプトでほとんどの変数が共通なので、 これらを関数化できないか?3 監視項目の閾値を超えたときにメール発報したい。4 ログの先頭に項目名をつけたい。 インターリンク株式会社
  107. 107. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~シェルスクリプトがわかってくると、こうした悩みが出てくるよね?次回は、if文 (条件分岐) や for文 (繰返し) 、関数を使ってスマートなスクリプトを書いてみよう! インターリンク株式会社
  108. 108. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~4. 質疑応答 インターリンク株式会社
  109. 109. ~ilstudy 第1回 ゆるふわ愛されシェルスクリプト~ご清聴有難うございました。 インターリンク株式会社

×