SSブログ
サーバ管理者のプログラミング ブログトップ
- | 次の10件

サーバ管理者のためのプログラミング入門(シェルプログラミング基礎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」と記述しよう。
#!/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回目以降も完全に動作することが約束されるのである。

 では、知識も経験も技術もへったくれも無い、サーバ管理者が最初に書くであろうシェルプログラミングの成果物はどのようなものになるだろうか…
 おそらく、以下のようなものになるだろう!
#!/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

 こんなシェルスクリプトを書いたって、それは君にとって立派なシェルプログラミングであり、この成果物は来月からは君の作業を大いにラクチンにしてくれることだろう。
 熟練したプログラマが見れば、このシェルスクリプトには「ツッコミどころが満載」であるし、決して「美しい」とはいえない。しかしこのシェルスクリプトでも君の欲している目的を十分に満たすことが出来れば、技術がどうとかいうことは気にする必要が無い。

 【技術はあとから身についてくる】

 だから、プログラミング経験の全く無いサーバ管理者の諸君も、今はそんなこと全く気にしなくても良い。
- | 次の10件 サーバ管理者のプログラミング ブログトップ

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。