2010/08/18

プロセスの終了を監視して再起動したりする

NILScriptのProcessオブジェクトにはイベント機構が用意されており、「exit」イベントでプロセスの終了を検出できます。システムによるプロセス終了通知機能を利用しているので、定期的にプロセスの有無をチェックするよりも少ない負荷で、高速に応答できます。

この機能を利用すれば、サーバなどのプロセスが予期せず終了した時に自動的に再起動するというような処理を、下記のような簡単なスクリプトで実現できます。
var p=Process.find('mspaint.exe')||Process.create('mspaint');
while(true){
 p.wait('exit');
 p=Process.create('mspaint');
}
「Process.find('mspaint.exe')」は、指定のプロセスが存在していればProcessオブジェクトを返すという処理です。プロセスが存在していなければ「undefined」という値が返ります。「Process.create('mspaint')」は、指定のコマンドラインのプロセスを起動を試み、成功すればProcessオブジェクトを返します。
「||」は、左の式を評価した結果がオブジェクトなどのtruthy値ならその値を返し、undefinedなどのfalsy値ならば右の式を評価した結果を返すという演算子です。左の式がtruthyの場合は、右の式は無視されます。
これらを組み合わせると、「プロセスが存在していればそれを表すProcessオブジェクトを、存在していなければ新たにプロセスを起動してそのProcessオブジェクトを返す」という処理になります。
このような「存在していなければ新規に作成」というテクニックは、よく利用するので覚えておくと良いでしょう。

p.wait('exit')が肝心の当該プロセスの終了まで待機する処理です。当該プロセスが順調に動作し続ければ、スレッドはこの部分で止まったままとなります。当該プロセスが終了すると、p.wait()から制御が戻り、次の処理に進みます。
次の行では、新たに起動したプロセスのProcessオブジェクトをp変数に代入します。
この2つの処理はwhile文で繰り返し実行されます。

この処理を他の常駐機能と一緒のスクリプトにまとめたい場合は、下記のようにThread.create()でスレッド化します。
Thread.create(function(){
 var p=Process.find('mspaint.exe')||Process.create('mspaint');
 while(true){
  p.wait('exit');
  p=Process.create('mspaint');
 }
});
プロセス監視機能を単独で使用したい場合でも、このようにスレッド化しておいて、「Main.createNotifyIcon();」という行を追加しておけば、タスクトレイアイコンから終了させられるようになって便利です。

0 件のコメント:

コメントを投稿