Home > Archives > 2008-01
2008-01
Cygwinでcronをインストール
- 2008-01-08 (火)
- 開発環境
Linux系OSに入っているタスクを自動実行するためのデーモンプロセス、cronをWindows環境でも使用するため,Cygwin((UNIXのフリーソフトウェア等をWindowsに移植したもの))を用いてcronをインストールしました。
まず、Cygwin Information and InstallationからCygwinをダウンロードしセットアップを開始します。
セットアップを進めていくと下の画面でインストールするパッケージを選択できます。ここでAdmin内のcronとcygrunsrvをInstallすればOK。

インストール後、サービスの設定には主に以下のサイトを参考にしました(謝々)。
- Comments: 0
- Trackbacks: 0
シェルスクリプトでプロセスを監視し自動実行&自動kill
- 2008-01-07 (月)
- Linux
今ある検索エンジンのデバッグを行っていますが、事情により短期間ですがクローズドな環境で運用されることになりました。構成は大きく分けてエンジンモジュールサーバ、クエリーモジュールサーバの二つのサーバからなっています。
デバッグはまだ途中なので、運用中にクエリーサーバorエンジンサーバのどちらか、もしくは両方が落ちる可能性もあります。落ちた場合は、手動で起動しなおすことになっていますが、せっかくなので自動化しよう。と、考えました。最初はcronデーモンを用いようと思いましたが、プロセスの監視(dead or alive)の仕方が分からず(調べきれず)、シェルスクリプトを用いることにしました(とは言うもののシェルスクリプトを使うのも初めてでした)。
参考にしたサイト:プロセス監視をするシェルスクリプト - [シェルスクリプト リファレンス & Tips]
上の参考ページの手法を用いて、クエリーサーバ&エンジンサーバのプロセスを一定の間隔で監視し、一方が何らかの原因で落ちた際は、再び二つのプロセスを再実行するようなスクリプトの作成を試みました。ここで、以下の要因を考慮に入れる必要がありました。
- エンジンorクエリーのどちらかが落ちたら、両システムも再起動する
- 起動順序はエンジン→クエリー
- エンジンの起動中にクエリーが起動するとエラー
- 同じターミナルではエンジン(サーバ)とサーバがうまく動作しない(もともと別々のマシンで動作させるものでもある)→別の端末でそれぞれ実行する(やっかい)
そこで、即席ではありますが、以下の二つのシェルスクリプトを作成しました。
検索エンジンモジュール用監視スクリプト(Echeckp.sh)
#!/usr/bin/sh
inter=3 # プロセスの監視間隔
wait=5 # serverの起動待ち時間
while true
do
isAliveSev=`ps -ef | grep "/server" |
grep -v grep | wc -l`
if [ $isAliveSev = 1 ]; then # serverが動いているか
echo "o:serverプロセス"
else
echo "x:serverプロセス"
pidEng=(`ps -ef | grep "/engine" |
grep -v grep | awk '{ print $2; }'`)
kill $pidEng
/ret/eng/engine &
flag=true
while $flag
do
echo "serverの起動待ち"
reAliveSev=`ps -ef | grep "/server" |
grep -v grep | wc -l`
if [ $reAliveSev = 1 ]; then
flag=false
fi
sleep $wait
reAliveEng=`ps -ef | grep "/engine" |
grep -v grep | wc -l`
if [ $reAliveEng = 0 ]; then # 両方止まったとき
/ret/eng/engine &
fi
done
fi
isAliveEng=`ps -ef | grep "/engine" |
grep -v grep | wc -l`
if [ $isAliveEng = 1 ]; then # engineが動いているか
echo "o:engineプロセス"
else
echo "x:engineプロセス"
pidSev=(`ps -ef | grep "/server" |
grep -v grep | awk '{ print $2; }'`)
kill $pidSev
/ret/eng/engine &
flag=true
while $flag
do
echo "serverの起動待ち"
reAliveSev=`ps -ef | grep "/server" |
grep -v grep | wc -l`
if [ $reAliveSev = 1 ]; then
flag=false
fi
sleep $wait
reAliveEng=`ps -ef | grep "/engine" |
grep -v grep | wc -l`
if [ $reAliveEng = 0 ]; then # 両方止まったとき
/ret/eng/engine &
fi
done
fi
sleep $inter # モニター間隔(秒単位)
done
続いて、
検索クエリーサーバモジュール用監視スクリプト(Scheckp.sh)
#!/usr/bin/sh
inter=3 # プロセスの監視間隔
wait=3 # engineの起動待ち時間
while true
do
isAliveEng=`ps -ef | grep "/engine" |
grep -v grep | wc -l`
if [ $isAliveEng = 1 ]; then
echo "o:engineプロセス"
else
echo "x:engineプロセス"
pidSev=(`ps -ef | grep "/server" |
grep -v grep | awk '{ print $2; }'`)
kill $pidSev
flag=true
while $flag
do
echo "engineの起動待ち"
reAliveEng=`ps -ef | grep "/engine" |
grep -v grep | wc -l`
if [ $reAliveEng = 1 ]; then
flag=false
fi
sleep $wait
done
/ret/sev/server &
fi
isAliveSev=`ps -ef | grep "/server" |
grep -v grep | wc -l`
if [ $isAliveSev = 1 ]; then
echo "o:serverプロセス"
else
echo "x:serverプロセス"
pidEng=(`ps -ef | grep "/engine" |
grep -v grep | awk '{ print $2; }'`)
kill $pidEng
flag=true
while $flag
do
echo "engineの起動待ち"
reAliveEng=`ps -ef | grep "/engine" |
grep -v grep | wc -l`
if [ $reAliveEng = 1 ]; then
flag=false
fi
sleep $wait
done
/ret/sev/server &
fi
sleep $inter # モニター間隔(秒単位)
done
と記述し、それぞれ別の端末でshコマンドで実行します。その際chmodで実行権限を与えておくことを忘れないようにします。また、待ち時間は状況に合わせて変更します(初期設定は3秒おきにチェック)。
一応、これで期待した自動復旧の動作はしましたが、冗長なコードの気がしますし、今回の問題解決にはもっと上手い手段があると思いました。
まぁ、それはそれ。
本分のデバッグ作業に戻りますか。
にしても、シェルスクリプトも興味深いです。
- Comments: 0
- Trackbacks: 0
Ruby: lambdaメソッドを使いブロックをオブジェクト化
- 2008-01-06 (日)
- Ruby
に関して、練習します。
他の言語と比較してRubyのコードブロックの扱いは特徴的で扱い難そうに見えますが、使いこなせればコード量を減らせるし、その結果として可読性も増すので、慣れていきたいです。
def times_n(n)
lambda { |x| x * n} # Kernel#lambdaの引数はブロック
# lambda do |x| x * n end でもよい(複数行に渉るときなど)。
end
times_ten = times_n(10) # nに10を代入
# 生成されたtimes_tenはProcインスタンス
p times_ten.class #=> Proc
# times_ten = { |x| x * n} はエラー。
# {}でのブロックはメソッドの引数としてのみ渡せる。
# また、ブロック引数はメソッドの最後の引数として定義する。
# ブロックの実行にはcallメソッドを用いる
p times_ten.call(5) # ブロック変数xに10が代入される
#=> 50
ここで、クラスProcとは
- Comments: 0
- Trackbacks: 0
Rubyで文字列から日本語文字をインデックス指定する
- 2008-01-05 (土)
- Ruby
RubyのStringインスタンスに格納されている文字列のインデックスを得るにはchrメソッドを用います。
ソースコード
# chrは文字コードObjを文字列Objに変換するメソッド str1 = "abcdef" p str1[2] #=> 99 p str1[2].chr #=> "c"
- Comments: 0
- Trackbacks: 0
JavaのソースコードからUMLのクラス図を作成
- 2008-01-04 (金)
- 開発環境
統合開発環境のEclipseでJavaのオセロプログラム(講義の課題)を制作中に一度クラス図を作成しようと試みました。使用プラグインはAmaterasUMLでこちらのサイト(軽量なUMLプラグインAmaterasUML (1/4) - @IT)を参考にしながらインストールを進めました。
さて、数あるUMLデザイナの中でこのプラグインのアドバンテージの一つはJavaクラスの継承関係などを包含したクラス図をソースコードから生成できる点にあると私は考えます。
その作り方は、まず「ファイル」→「新規」→「その他」から「AmaterasUML」→「クラス図」と選択してクラス図ファイルを作成し、そのファイルをダブルクリックしクラス図エディタを起動します。その上にクラスファイルをドラックアンドドロップすれば、そのクラスのクラス図が作成されます。また継承関係などを表したい場合は、その関係のクラスを選択した上でドラッグ&ドロップすればOK。下図にその使用状況を示します。
ちなみに、これによって作成された図は画像形式でエクスポートできます。
人にプログラムの構造の説明する際に役立つので重宝しています。
- Comments: 0
- Trackbacks: 0
Home > Archives > 2008-01

