昨日から、はてなダイアリーに技術のチップスを書いたりし始めたのだが、そっちが継続していけるか甚だ怪しかったりもするので、こっちにもダブルポストしておく。
昨日の仕事でそういうことをやっていたのだが、どうやって1日でプロセス監視とRESTでの報告をやろうかと調べ回った結果、JavaScript1本で出来ちゃいましたよという話。
Windowsには標準でWSHというVBScriptとかJavaScript(もといJScript)を解析するスクリプトエンジンが載っている。それでWindowsのプロセスも取れるし、みんながAjaxを使うときに使っているXMLHTTPを使ってRESTを叩くことも出来る。
var locator = WScript.CreateObject("WbemScripting.SWbemLocator.1");
var service = locator.ConnectServer();
var set = service.ExecQuery("select * from Win32_Process");
while (true) {
for (var e = new Enumerator(set); !e.atEnd(); e.moveNext()) {
var p = e.item();
if (p.Caption == find) {
//findが実行ファイル名(calc.exe等)
//該当すればここに書いてあることが実行できる
}
}
WScript.sleep(5000);
}
で、RESTを叩くには、
var xmlhttp = WScript.createObject('WinHttp.WinHttpRequest.5.1');
//第3引数がfalseなので同期通信、trueなら非同期通信
xmlhttp.open(method, url, false);
xmlhttp.send('id=' + id + '&node[status]=' + status);
ちなみにRESTを受ける口はRuby on Railsのscaffoldなので、methodとurlの組み合わせは以下のようになる。
rails action | method | url |
---|---|---|
create | POST | http://localhost:3000/nodes.xml |
update | PUT*1 | http://localhost:3000/nodes/1.xml |
destroy | DELETE*2 | http://localhost:3000/nodes/1.xml |
*1 実際はPOSTして&_method=putというパラメータをつけて送る
*2 実際はPOSTして&_method=delete(ry
こんな感じのJScriptを書いて、.jsで保存する。で、そのファイルをダブルクリックして起動すると画面は表示されずに監視がバックグラウンドで始まる。終了する方法はちょっと残念だがタスクマネージャのプロセスのところから、wscript.exeというのを探して落とすしかない。こういうスクリプトを複数動かしていたら、どうやって目的のものかを探すのかは今後の課題。
WScript.echo()でメッセージを表示しようとすると、ダイアログがポップアップして表示される。コマンドラインから起動すると標準出力に出る。
素晴らしい!