ミッションたぶんPossible

どこにでもいるシステムエンジニアのなんでもない日記です。たぶん。

wgetで定期的にWeb画面情報を取得する

はじめに

wgetというツールとDOSコマンドを使って、定期的(10分間隔)にWebページ情報をダウンロードし続けるプログラムを作りましたよ、と。

目的

案件が運用フェーズということもあって、今は実はあんまりFlexは触ってません(腕がなまっちゃう><;)。その代わり、というのもなんですが、今までは個人的には経験の少ない運用周りというか障害対応が、ここ一年くらいの従事案件におけるオレのメインタスクになっています。


で、今回は「どうもTomcat残留するSessionの数が多過ぎる気がする」というチームリーダーの憂いを払拭する為にこのオレが立ち上がった!…訳ではなく、単にオレが一番手隙だっただけですが、まぁそんなこんなでこの問題に対応して行くことになった次第です。…オレFlex担当なんだけどなぁ、まぁいいけどさ。


Tomcatがその瞬間保持しているSessionの数は、Tomcat管理画面で確認できます。

管理画面左上の「Tomcat Manager」をクリックすると…。

「Session」という列に書かれているのが各アプリごとの現在のSession数ですね。これは実際に問題が起こっているサーバの管理画面ですが、上から5つ目のアプリ(一応守秘義務とかあるんで、大事なところはぼかしました)のSession数が妙に多いのが分かると思います。



で、こいつを定期的に監視して傾向を調べることにしました。途中を端折りますが、とりあえず異常は無くてアクセス数の増減に比例しているんじゃないか、という事までなんとなく分かりました。んじゃあそれを立証する為にアクセス数とSession数の推移を比較してみよう、という事になったんです。それもアクセスのピーク時と最も少ない時の両方が存在する、夕方〜朝方の時間帯。


ぶっちゃけ日中ならチマチマ監視しようかと思ってたんですが(傾向だけ掴めればいいし)、深夜なんかにそんなことやってらんないので、Tomcat管理画面からデータを引っ張ってこれる方法を探す事にしました。ま、結果としてスマートな方法が見つからず、今回は10分置きにTomcat管理画面をHTMLごとDLしてきて、後からまとめてツール(Javaでスクラッチ!)で必要な数値だけHTMLから抜き出すことにしました。


wget for Window

今回HTMLをDLする為に用いたのが「wget(ダブルゲットと読むらしい)」です。本来はUNIX / Linux系のツールなんですが、Windwos版も公開されていたので、今回はWin版を使っています(DLはこちらから)。
この「wget」なんですが、単にHTMLを落としてくるだけでなく、実行時のオプション指定でBASIC認証やProxyもクリアすることができます。今回書いた要素を取り出すと、以下のように書いています。

wget --http-user=[Tomcat管理画面の管理者ID] --http-passwd=[Tomcat管理画面のパスワード] [DLしたいWebページ]

オレが参考にしたサイトは以下になりますので、オプション一覧等もそちらから参照して下さい。

wget(Windows版) - 俺の基地
wget の使い方
Basic認証でwget - cloned.log


実際に動かした内容は以下。オレの場合、DLしてきたwgetはC:\直下にフォルダごと配置しています。

C:\temp>C:\wget\bin\wget --http-user=[Tomcat管理画面の管理者ID] --http-passwd=[Tomcat管理画面のパスワード] http://[サーバ名]:8080/manager/html/sessions?path=/[アプリ名]

DOSコマンド

で、これを「10分置きに自動的に実行する」必要があります。この部分はDOSコマンドで書きました。


しかしメンドクサイことに、DOSコマンドには一定時間処理を待機させる「sleep」コマンドが無いんですよねぇ。C言語かなんかで自作したり、あるいは誰かが作ったのを落としてきて使ったり、といったさまざまな方法があるんですが、オレの場合PCに色々入れたくなかったので、「ping」コマンドを使って応答時間分だけ処理を待機させる、というこれまたスマートでない方法を選択しました。…ま、アクセス先もlocalhostだし、周りに迷惑掛けてないから構わんだろ?

pingは一回の実行毎に1秒待機するものと想定しています。「-n」オプションでリトライ回数を指定できるので、10分待つ場合には「600」を指定する事になります。…あくまで「おおまかな時間」なので、正確に10分取る場合にはこの方法は使えませんよ。ご注意あれ。

@echo off
:label01
C:\temp>C:\wget\bin\wget --http-user=[Tomcat管理画面の管理者ID] --http-passwd=[Tomcat管理画面のパスワード] http://[サーバ名]:8080/manager/html/sessions?path=/[アプリ名]
ping localhost -n 600 > nul
goto label01

ちなみにこの実装には以下を参考にしました。

DOSコマンドでの単純なループ処理 - UNIX・Linux 解決済 | 教えて!goo


さて、これだけだと毎回同じファイル名でHTMLを保存してしまうので、毎回名前を変える必要があります。できれば取得時間がファイル名から分かるようにしたい。なんで「-O」オプションを使って時間をファイル名に組み込む事にしました。今回はあんま細かい時間や、逆に日付みたいな大きな括りの値はいらないので、時間と分だけ取るようにしています。

@echo off
:label01
set HHMM=%time:~0,2%%time:~3,2%
C:\temp>C:\wget\bin\wget -O [出力後のHTMLのファイル名]_%HHMM%.html --http-user=[Tomcat管理画面の管理者ID] --http-passwd=[Tomcat管理画面のパスワード] http://[サーバ名]:8080/manager/html/sessions?path=/[アプリ名]
ping localhost -n 600 > nul
goto label01


で、これを実行したら見事に失敗しました。当日の「23:59」までは上手く行ったんですが、日付が変わると「00:00」じゃなくて「 0:00」というように、先頭が半角スペースになってしまったんですね。結果としてファイル名が正しく指定できず、日付変更以降はひたすら同じファイルを上書きし続ける、という間抜けな事態が起こってたみたいです。


よって、これを若干修正。半角スペースを0に置換するようにしました。

@echo off
:label01
set HHMM=%time:~0,2%%time:~3,2%
C:\temp>C:\wget\bin\wget -O [出力後のHTMLのファイル名]_%HHMM: =0%.html --http-user=[Tomcat管理画面の管理者ID] --http-passwd=[Tomcat管理画面のパスワード] http://[サーバ名]:8080/manager/html/sessions?path=/[アプリ名]
ping localhost -n 600 > nul
goto label01


これでOK!完成です。ちなみにこの辺は以下を参考にしています。

コマンドプロンプト 日付フォーマット - argius note


終わりに

JavaでHTMLから必要な数値を取り出す部分は、正直大して面白くも無いのでここでの説明は省きます。自分用の備忘録みたいなもんですけど、何かの参考になれば幸いです。


余談

このブログでちゃんと技術情報(しょぼいけど)書いたの久々だなぁ、最近単なるサッカーブログだったし。どうしてこうなった!