Windowsのプロセスを監視してRESTするスクリプト

昨日から、はてなダイアリーに技術のチップスを書いたりし始めたのだが、そっちが継続していけるか甚だ怪しかったりもするので、こっちにもダブルポストしておく。

昨日の仕事でそういうことをやっていたのだが、どうやって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()でメッセージを表示しようとすると、ダイアログがポップアップして表示される。コマンドラインから起動すると標準出力に出る。

素晴らしい!

この記事を書いた人

井上 研一

株式会社ビビンコ代表取締役、ITエンジニア/経済産業省推進資格ITコーディネータ。AI・IoTに強いITコーディネータとして活動。2018年、株式会社ビビンコを北九州市に創業。IoTソリューションの開発・導入や、画像認識モデルを活用したアプリの開発などを行っている。近著に「使ってわかった AWSのAI」、「ワトソンで体感する人工知能」。日本全国でセミナー・研修講師としての登壇も多数。