Linuxホームサーバー編
No.12 自動で止めるにはどうするの?2
(シェルスクリプトに挑戦だ!)

2005,3/27 完成


今回はいよいよシェルスクリプトに挑戦です。
わずか数十行とは言え、プログラムと名がつく物を作るのはPC-9801時代の
N88BASIC+Z80アセンブラ以来ですから15年ぶりくらいでしょうか。
けっこうドキドキします。 (^_^;)
(こういうN88BASICのサイトが見つかって感動〜。あるんですねエミュレーターが。)


1)シャルスクリプトってどうやったら動くの?
いきなり本番に臨む前にシャルスクリプトをどうやって動かすのか試してみるために
超簡単なソフトを作ってみました。

まず、いつものエディターを起動し"test"というファイルを作りました。
(デスクトップから、アプリケーション→アクセサリ→GNOMEテキストエディタ)



最初の"#!/bin/bash"という行は「/bin/にあるbashというシェルを使いますよ、」
という宣言だそうです。
そういえばperlを使ったcgiでも似たような宣言をしていますね。
シェルにも色々種類があるそうですが今回は何も考えずLinux標準のbashを使う
事にしました。
次の、
 test="mumumumu $usr"
という行は、
 "mumumumu"という文字列に今使っているユーザー名($usr)を加えて
 testという変数に代入する。
という意味です。(たぶん、、、)
最後の、
 echo $test
という行は、
 testという変数の値を表示する。
という意味です。

つまり、rootで使っている場合、”mumumumu root"という文字が表示されれば大成功、
というほとんど何の意味もないソフトです。 (^_^;)

以上、3行のファイルをtestという名前で保存していつものGNOME端末
(アプリケーション→システムツール→GNOME端末)上でlsとやると、
ちゃんとtestというファイルができているのが見えます。



さて、プログラムは書いたもののどうすれば実行できるんでしょう??
本などあさって調べてみたら、まずパーミッションをいじって実行可能な形式にして
あげなければならないそうです。
そのためにはwindowsでいうところのエクスプローラーを開いて、

 testファイルを選択→右クリック→プロパティ→アクセス権→所有者の"実行"をチェック

とやると、ただのテキストファイルがプログラムとして実行が可能なファイルに
なりました。
すげー



試しに再びGNOME端末でlsしてみるとtestが緑色の文字で表示されています。
どうやらこれは”実行可能ファイル”ということを表しているようです。
(違ってたらすいません。)



次にいよいよtestの実行です。
そのままGNOME端末から、
 ./test
と入力します。
ファイル名の手前に./と入れるのがミソですね。
(この./にはどういう意味があるかわかりませんがtestだけでは動作しません。)
すると確かに”mumumumu root"と表示されています。 (^_^)



やりぃ!超簡単でもLinux上で自分のプログラムが動いた、
というのはかんどーです。


調子にのってそのまま誰も居なくなったら自動でシャットダウンしてくれる
ソフトを作ってみました。


2)いよいよ自動シャットダウンスクリプトを作っちゃおう

自動シャットダウンのスクリプトはonoff_checkという名前にしました。
使う変数はonoffの1つだけ。
今回は192.168.0.10、192.168.0.11、192.168.0.12のIPアドレスを持つ
3台のパソコンを順番にpingして、反応があれば(動いていれば)onoffの値を10にする。
pingが終わった後、onoffの値が10であれば何もせず、10以外の値(=0のまま)であれば
動いているクライアントパソコンは1台もないと判断してシャットダウンする、という
至極簡単なソフトです。

簡単とは言え、文法を間違ったりなんだりしながら出来上がったのが以下のスクリプトです。

onoff_check
スクリプトリスト
説明
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/bin/bash
onoff=0
ping 192.168.0.10 -c 4
if [ $? = 0 ]
then
onoff=10
fi

ping 192.168.0.11 -c 4
if [ $? = 0 ]
then
onoff=10
fi

ping 192.168.0.12 -c 4
if [ $? = 0 ]
then
onoff=10
fi

if [ $onoff = 10 ]
then
echo "PC ON"
else
echo "PC OFF"
halt -p
fi
 
←onoffという関数を初期化します。
←1台目ping *1
←pingで反応があったら、 *2
 
 onoffに10の値を入れます。
 
 
←2台目ping
←pingで反応があったら、
 
 onoffに10の値を入れます。
 
 
←3台目ping
←pingで反応があったら、
 
 onoffに10の値を入れます。
 
 
←もしonoffの値が10だったら、
 
  "PC ON"と表示する(ほんとは不要 *3)
←もしonoffの値が10でなかったら、
  "PC OFF"と表示して(ほんとは不要 *3)
  PCをシャットダウンする!
  おしまい。
*1 ”-c 4”というのは4回パケットを送る、という意味です。(pingの解説
*2 $?というのは特殊な変数で、最後に実行したコマンドのexit値が入っている。
   pingの場合、全く応答パケットを受け取らなかった場合には、$?= 1となり、
  エラーがあれば$?=2となり、応答パケットがある場合は$?=0となる。
  つまりpingを送ったパソコンが動いていたら$?=0ということ。(大事!)
*3 特に意味はないのですが試しに入れてみました。


このonoff_checkを上で書いたようにパーミッションをいじって実行可能なファイルとして、
コマンドプロンプトから、
 ./onoff_check
と打ち込むと、
 ・3台のクライアントPCのうち1台以上動いていると何も起こらず。
 ・3台のクライアントPCすべての電源がOFF(もしくはネットワークにつながっていない)と
  VineLinuxマシンがシャットダウン!
という期待通りの動きをしてくれました。
やったーい、大成功!


クライアントPCが増えた時には3行から7行までのかたまりをIPアドレスだけ変えて
付け足してあげればOKです。(FOR〜NEXTを使わないところがいと悲し、 (^_^;) )
あとはこのシェルスクリプトを定期的に実行すれば完成です。(次回に続く)


←戻る 進む→
ホームに戻る