サーバ管理者のためのプログラミング入門(シェルプログラミング基礎2) [サーバ管理者のプログラミング]
それでは、「シェルスクリプトプログラミング」を実践するに当たってとにかく『最初に覚えなければならないこと』の紹介から。
2点あって…
ポイント1:シェルスクリプトの先頭に、必ず「シェバング」を書くこと
ポイント2:シェルスクリプトファイルに、実行権(x)を忘れずに付与すること
この2つ。
ポイント1:シェルスクリプトの先頭に、必ず「シェバング」を書くこと
『シェバング』って何?という人にその説明から。
シェバングとは、そのスクリプトを解釈できるインタプリタを指定する行のことを言う。シェルスクリプトも含め、各種スクリプトファイルの必ず『先頭』に、
#!
で始まる行を記述する。
シェルスクリプトの場合では
#!/bin/sh
#!/bin/bash
#!/bin/csh -f
とか書いたりする。(kshとかもあると思うけどね…)
また、他によくあるケースとしては、perlスクリプトの
#!/usr/bin/perl
とかいうものも。rubyとかexpatとかawkとかもある。
シェルスクリプトの場合は、
#!/bin/sh
と書いておくのが多いだろうか。ちなみにこの一連のエントリーでは、bashを使うが、シェバングは#!/bin/shと書いていることがほとんどになると思う。
ポイント2:シェルスクリプトファイルに、実行権(x)を忘れずに付与すること
最初のころは、これをよく忘れるんだ。(笑)
要するに、「chmod +x hoge.shを忘れずにやっとけ!」ということね。実行権がないとそもそも実行されないので。
というわけで、この2つの条件を満たせばたちまちシェルスクリプトになってしまうのである。
たとえば、dateコマンドを用い、機能の日付を表示するシェルスクリプト「hoge.sh」を作成すると仮定する。(面白くないサンプルだが…)表示形式は、YYYY/MM/DDということにしよう。
ということは、シェルスクリプトの中身として実行するコマンドは…
date '+%Y/%m/%d' --date yesterday
ということになる。これを「hoge.sh」で実行できるようにしてみる。
viなどの適当なエディタで、シェルスクリプトを作成する。「vi hoge.sh」でファイルを開く。
まず最初にすることはシェバングの記述だ。先ほどの説明のとおり、「#!/bin/sh」と記述しよう。
その次の行から、処理の内容を記述する。先ほどのdateコマンドを記述するのである。
これでエディタを終了し、ファイルを保存する。
lsコマンドで確認すると、ファイルがちゃんと作成されていることだろう。
続いて、シェルスクリプトに実行権を与えるのである。
コマンドは「chmod +x hoge.sh」である。
…といきたいところだが、良い機会なので実行件を付与し忘れたシェルスクリプトを実行しようとするとどうなるのか、見ておくことにしよう。
このように、「許可がありません」(エラーメッセージが英語で出力される場合は「Permission denide」)というエラーになる。このような場合はほぼ間違いなくchmodコマンドを実行し忘れているということを覚えておこう。
では、実行権を付与してから実行するとちゃんと動くだろうか。試してみよう。
きちんと実行されたことがわかる。
ls -l等で確認すれば一目瞭然。
chmod +xする前(viでシェルスクリプトを作成した直後)なら
と、パーミッションの表示部分に「x」が無いし、chmod +xした後なら
と、このように「x」が付いている。
ところで。
実はシェバングをつけなくても、chmod +xで実行権を付与しなくても、シェルスクリプトが実行できてしまう方法がある。
シェバングも実行権も無いシェルスクリプトの例を以下に示す。
シェルスクリプト「hoge2.sh」にはシェバングも無ければ実行権もない。このようなファイルをシェルスクリプトとして実行するには、コマンドラインインタプリタの引数に、実行したいファイル名を指定するとよい。
つまり、「sh hoge2.sh」と指定するのである。
このとおり、実行されてしまった。
しかしよくある方法で実行しようとしても…
…と、なる。
実はこの方法による使い分けは地味に役立つことがある。
たとえば、会社などでサーバの管理者が複数いるケース。重要なコマンドが記述されているシェルスクリプトをうっかり実行して欲しくないということもあるだろう。好奇心旺盛な新人君が、うっかり実行してしまいひどい目にあうことを防止することも可能だ。細かいノウハウだが意外と効果あるので活用してみてほしい。
次のアーティクルでは、「変数」について基礎的なところを説明することにする。
2点あって…
ポイント1:シェルスクリプトの先頭に、必ず「シェバング」を書くこと
ポイント2:シェルスクリプトファイルに、実行権(x)を忘れずに付与すること
この2つ。
ポイント1:シェルスクリプトの先頭に、必ず「シェバング」を書くこと
『シェバング』って何?という人にその説明から。
シェバングとは、そのスクリプトを解釈できるインタプリタを指定する行のことを言う。シェルスクリプトも含め、各種スクリプトファイルの必ず『先頭』に、
#!
で始まる行を記述する。
シェルスクリプトの場合では
#!/bin/sh
#!/bin/bash
#!/bin/csh -f
とか書いたりする。(kshとかもあると思うけどね…)
また、他によくあるケースとしては、perlスクリプトの
#!/usr/bin/perl
とかいうものも。rubyとかexpatとかawkとかもある。
シェルスクリプトの場合は、
#!/bin/sh
と書いておくのが多いだろうか。ちなみにこの一連のエントリーでは、bashを使うが、シェバングは#!/bin/shと書いていることがほとんどになると思う。
ポイント2:シェルスクリプトファイルに、実行権(x)を忘れずに付与すること
最初のころは、これをよく忘れるんだ。(笑)
要するに、「chmod +x hoge.shを忘れずにやっとけ!」ということね。実行権がないとそもそも実行されないので。
というわけで、この2つの条件を満たせばたちまちシェルスクリプトになってしまうのである。
たとえば、dateコマンドを用い、機能の日付を表示するシェルスクリプト「hoge.sh」を作成すると仮定する。(面白くないサンプルだが…)表示形式は、YYYY/MM/DDということにしよう。
ということは、シェルスクリプトの中身として実行するコマンドは…
date '+%Y/%m/%d' --date yesterday
ということになる。これを「hoge.sh」で実行できるようにしてみる。
viなどの適当なエディタで、シェルスクリプトを作成する。「vi hoge.sh」でファイルを開く。
まず最初にすることはシェバングの記述だ。先ほどの説明のとおり、「#!/bin/sh」と記述しよう。
#!/bin/sh
その次の行から、処理の内容を記述する。先ほどのdateコマンドを記述するのである。
#!/bin/sh date '+%Y/%m/%d' --date yesterday
これでエディタを終了し、ファイルを保存する。
lsコマンドで確認すると、ファイルがちゃんと作成されていることだろう。
[root@kagami tmp]# ls -la hoge.sh -rw-r--r-- 1 root root 44 1月 14 17:46 hoge.sh
続いて、シェルスクリプトに実行権を与えるのである。
コマンドは「chmod +x hoge.sh」である。
…といきたいところだが、良い機会なので実行件を付与し忘れたシェルスクリプトを実行しようとするとどうなるのか、見ておくことにしよう。
[root@kagami tmp]# ./hoge.sh -bash: ./hoge.sh: 許可がありません
このように、「許可がありません」(エラーメッセージが英語で出力される場合は「Permission denide」)というエラーになる。このような場合はほぼ間違いなくchmodコマンドを実行し忘れているということを覚えておこう。
では、実行権を付与してから実行するとちゃんと動くだろうか。試してみよう。
[root@kagami tmp]# chmod +x hoge.sh [root@kagami tmp]# ./hoge.sh 2010/01/13
きちんと実行されたことがわかる。
ls -l等で確認すれば一目瞭然。
chmod +xする前(viでシェルスクリプトを作成した直後)なら
[root@kagami tmp]# ls -la hoge.sh -rw-r--r-- 1 root root 44 1月 14 17:46 hoge.sh
と、パーミッションの表示部分に「x」が無いし、chmod +xした後なら
[root@kagami tmp]# ls -la hoge.sh -rwxr-xr-x 1 root root 44 Jan 14 17:46 hoge.sh
と、このように「x」が付いている。
ところで。
実はシェバングをつけなくても、chmod +xで実行権を付与しなくても、シェルスクリプトが実行できてしまう方法がある。
シェバングも実行権も無いシェルスクリプトの例を以下に示す。
[root@kagami tmp]# cat hoge2.sh date '+%Y/%m/%d' --date yesterday [root@kagami tmp]# ls -la hoge2.sh -rw-r--r-- 1 root root 34 Jan 14 17:56 hoge2.sh
シェルスクリプト「hoge2.sh」にはシェバングも無ければ実行権もない。このようなファイルをシェルスクリプトとして実行するには、コマンドラインインタプリタの引数に、実行したいファイル名を指定するとよい。
つまり、「sh hoge2.sh」と指定するのである。
[root@kagami tmp]# sh hoge2.sh 2010/01/13
このとおり、実行されてしまった。
しかしよくある方法で実行しようとしても…
[root@kagami tmp]# ./hoge2.sh -bash: ./hoge2.sh: 許可がありません
…と、なる。
実はこの方法による使い分けは地味に役立つことがある。
たとえば、会社などでサーバの管理者が複数いるケース。重要なコマンドが記述されているシェルスクリプトをうっかり実行して欲しくないということもあるだろう。好奇心旺盛な新人君が、うっかり実行してしまいひどい目にあうことを防止することも可能だ。細かいノウハウだが意外と効果あるので活用してみてほしい。
次のアーティクルでは、「変数」について基礎的なところを説明することにする。
サーバ管理者のためのプログラミング入門(シェルプログラミング基礎1) [サーバ管理者のプログラミング]
個人的な信条として、「rootのパスワードを握る者はせめてC言語でUNIX/Linuxシステムコールプログラミングの基礎知識ぐらい持ってろ」というものがあるのだけども、実際の問題としてプログラミングの知識も経験もほとんど無いサーバ管理者というものが増えつつあり、しかもその数が決して少なくないみたいなんだな。
やれやれ…
が、そんなサーバ管理者であっても、時としてプログラミングを強要されるシーンが無いとも限らず、たとえば同じような処理を沢山のサーバで延々と実行しなきゃならないケースなど、手でいちいちコマンド入力していたら面倒くさいし、それだけヒューマンエラーの発生しうる余地が増えるとあって、せめてシェルスクリプトくらいは書けるようになっておかないと…と思うこともあるようだ。
#「あるようだ」と書いているのは、私にはプログラミングの知識も経験もあるので
#そんな場合にはとっととスクリプトを書いてしまうからそんな苦労に遭遇しないの
#である…
経験の浅いサーバ管理者で、「さあ!シェルプログラミングを!」と迫られるとしり込みしてしまう傾向にあるようだが、プログラミングというものを難しく考えているというのがそもそもの原因であるように思う。
そんな若いサーバ管理者諸君に問う!
プログラミングとはなんぞや!?
それは…
実行したいコマンドを 実行したい順番に書き並べただけの サーバ向けの作業手順書に過ぎない!
…と、割り切ってしまえばそんなに難しい話ではない。(笑)
やれ、オブジェクト指向がどうとか、構造化プログラミングがどうとか、アルゴリズムがどうとか、ロジックがどうとか、そんなことを気にする必要は全く無い!どうせサーバ管理者はプログラムを売って食っていく職業ではないので、アプリケーション開発者が吐き気を催すような、アレなプログラムを書いたところで一向に構わないのである!
たとえば。
『サーバA、サーバB、サーバC…サーバZの26台のサーバに、今からyum updateを実行したい。』
という処理を実行すると仮定する。そして、それは1~2ヶ月に1度実行する必要がある処理だとする。
毎月毎月、君は26台のサーバにログインして yum update を実行しなければならないとしたらうんざりしないか?
「26台くらいなら別に…」 と、KYな反応をするそこの君!26台が50台だったら…200台だったら…それでも君は同じKYな反応をするかね?(笑)
こんな場合に、せめてシェルプログラミングが出来れば、1回だけ苦労しておけばあとはコマンド一発で済むのだよ?そしてその初回の1回だけ、完全に動作することを確認できれば、ほとんどの場合2回目以降も完全に動作することが約束されるのである。
では、知識も経験も技術もへったくれも無い、サーバ管理者が最初に書くであろうシェルプログラミングの成果物はどのようなものになるだろうか…
おそらく、以下のようなものになるだろう!
こんなシェルスクリプトを書いたって、それは君にとって立派なシェルプログラミングであり、この成果物は来月からは君の作業を大いにラクチンにしてくれることだろう。
熟練したプログラマが見れば、このシェルスクリプトには「ツッコミどころが満載」であるし、決して「美しい」とはいえない。しかしこのシェルスクリプトでも君の欲している目的を十分に満たすことが出来れば、技術がどうとかいうことは気にする必要が無い。
【技術はあとから身についてくる】
だから、プログラミング経験の全く無いサーバ管理者の諸君も、今はそんなこと全く気にしなくても良い。
やれやれ…
が、そんなサーバ管理者であっても、時としてプログラミングを強要されるシーンが無いとも限らず、たとえば同じような処理を沢山のサーバで延々と実行しなきゃならないケースなど、手でいちいちコマンド入力していたら面倒くさいし、それだけヒューマンエラーの発生しうる余地が増えるとあって、せめてシェルスクリプトくらいは書けるようになっておかないと…と思うこともあるようだ。
#「あるようだ」と書いているのは、私にはプログラミングの知識も経験もあるので
#そんな場合にはとっととスクリプトを書いてしまうからそんな苦労に遭遇しないの
#である…
経験の浅いサーバ管理者で、「さあ!シェルプログラミングを!」と迫られるとしり込みしてしまう傾向にあるようだが、プログラミングというものを難しく考えているというのがそもそもの原因であるように思う。
そんな若いサーバ管理者諸君に問う!
プログラミングとはなんぞや!?
それは…
実行したいコマンドを 実行したい順番に書き並べただけの サーバ向けの作業手順書に過ぎない!
…と、割り切ってしまえばそんなに難しい話ではない。(笑)
やれ、オブジェクト指向がどうとか、構造化プログラミングがどうとか、アルゴリズムがどうとか、ロジックがどうとか、そんなことを気にする必要は全く無い!どうせサーバ管理者はプログラムを売って食っていく職業ではないので、アプリケーション開発者が吐き気を催すような、アレなプログラムを書いたところで一向に構わないのである!
たとえば。
『サーバA、サーバB、サーバC…サーバZの26台のサーバに、今からyum updateを実行したい。』
という処理を実行すると仮定する。そして、それは1~2ヶ月に1度実行する必要がある処理だとする。
毎月毎月、君は26台のサーバにログインして yum update を実行しなければならないとしたらうんざりしないか?
「26台くらいなら別に…」 と、KYな反応をするそこの君!26台が50台だったら…200台だったら…それでも君は同じKYな反応をするかね?(笑)
こんな場合に、せめてシェルプログラミングが出来れば、1回だけ苦労しておけばあとはコマンド一発で済むのだよ?そしてその初回の1回だけ、完全に動作することを確認できれば、ほとんどの場合2回目以降も完全に動作することが約束されるのである。
では、知識も経験も技術もへったくれも無い、サーバ管理者が最初に書くであろうシェルプログラミングの成果物はどのようなものになるだろうか…
おそらく、以下のようなものになるだろう!
#!/bin/bash ssh serverA yum -y update ssh serverB yum -y update ssh serverC yum -y update ssh serverD yum -y update ssh serverE yum -y update ssh serverF yum -y update ssh serverG yum -y update ssh serverH yum -y update ssh serverI yum -y update ssh serverJ yum -y update ssh serverK yum -y update ssh serverL yum -y update ssh serverM yum -y update ssh serverN yum -y update ssh serverO yum -y update ssh serverP yum -y update ssh serverQ yum -y update ssh serverR yum -y update ssh serverS yum -y update ssh serverT yum -y update ssh serverU yum -y update ssh serverV yum -y update ssh serverW yum -y update ssh serverX yum -y update ssh serverY yum -y update ssh serverZ yum -y update
こんなシェルスクリプトを書いたって、それは君にとって立派なシェルプログラミングであり、この成果物は来月からは君の作業を大いにラクチンにしてくれることだろう。
熟練したプログラマが見れば、このシェルスクリプトには「ツッコミどころが満載」であるし、決して「美しい」とはいえない。しかしこのシェルスクリプトでも君の欲している目的を十分に満たすことが出来れば、技術がどうとかいうことは気にする必要が無い。
【技術はあとから身についてくる】
だから、プログラミング経験の全く無いサーバ管理者の諸君も、今はそんなこと全く気にしなくても良い。