ラベル 自動化 の投稿を表示しています。 すべての投稿を表示
ラベル 自動化 の投稿を表示しています。 すべての投稿を表示

2011/03/30

ノートPCのAC電源復旧時にWoLでデスクトップPCを起動

停電時でもPCに稼働し続けて欲しければ、バッテリを搭載しているノートPCを使用するのが無難ですが、PCI接続の機器などを使う必要がある場合、デスクトップPCを選択せざるを得ません。
デスクトップPCでは、バッテリによる予備電源を提供するUPS(無停電電源装置)を利用しても、長時間に及ぶ停電を無停止で乗り切ることは出来ません。
また、USB接続などでPCと連動して停電時に自動で安全なシャットダウンを行う機能は多くのUPSに用意されていますが、電源復旧時にPCを自動で起動する機能は用意されていないことがあり、外出などで手動での電源投入が行なえない状況では、長時間シャットダウンされたままになってしまうことがあります。

どうしてもデスクトップPCの停止時間を最小限にとどめたければ、別途ノートPCを起動しておき、そこからデスクトップPCを自動起動させるとよいでしょう。

NILScriptでは「System.hasAC」で電源が供給されているかどうかを取得できる他、System.observe()で「powerStatusChange」イベントにコールバック関数を登録することで、電源の状態が変化したときに任意の処理を実行させられます。
また、LAN上にマジックパケットをブロードキャストして指定のコンピュータを起動させるWOL(WakeOnLAN)の機能も最近追加されました。
これらの機能を利用して以下のようなスクリプトを作成し、AC電源に接続したノートPC上で実行しておけば、AC電源が断たれた状態から復旧したときに自動で指定のPCを起動してくれるはずです。

var mac="00 01 02 03 04 05";//起動対象PCのMACアドレス
var dest="192.168.1.255"; //パケット送信先のブロードキャストアドレス

Main.createNotifyIcon();
var power=System.hasAC;

System.observe('powerStatusChange',function(){
 if(!power && System.hasAC){
  require('WOL').WOL.send(mac,dest);
 }
 power=System.hasAC;
});

なお、WOLでPCを遠隔起動するには、対象のPCがWOLに対応したLANカードでルーターに有線接続されていて、BIOSの設定でWOLが有効になっている必要があります。
また、停電でルーターが停止してしまう場合、powerStatusChangeイベントで電源復旧を検出した直後にWOL.send()を行ってもパケットが到達しない可能性があるため、適宜sleep()などを挿入して下さい。

2010/12/13

入出力のコンソールを子プロセスと共有して進捗などを表示

NILScriptは、コマンドラインで指定された処理を行って直ちに終了するコンソールプログラムを組み合わせた自動処理の実現にも役立ちます。

動画変換やダウンロードなど時間のかかる処理を行うプログラムの多くは、標準出力で進捗状況を確認できるようになっていますが、作業中にバックグラウンドで自動処理させたい場合には、子プロセスが起動するたびにコンソールウィンドウが表示されては邪魔になってしまいます。
しかし、完全に出力を非表示にしてしまうと、残り所要時間が把握しづらく不便です。

スクリプトのプロセスが所有するコンソールに子プロセスの出力を表示するようにすれば、いちいち新たなウィンドウを表示せずに進捗状況を確認できるようになって便利です。
NILScriptのrun()やProcess.create()では、以下のようにオプションオブジェクトに「shareConsole:true」を指定する事で、子プロセスと現在のプロセスのコンソールを共有させられるので、簡単に子プロセスの出力を自分のコンソールに表示させられます。

println("1/3")
run('"'+app1+'" "'+file+'"',{shareConsole:true}).waitExit();
println("2/3")
run('"'+app2+'" "'+file+'"',{shareConsole:true}).waitExit();
println("3/3")
run('"'+app3+'" "'+file+'"',{shareConsole:true}).waitExit();
println("done");

2010/09/24

省電力状態からの自動復帰も可能なタイマー機能

NILScriptに用意されている「Timer」クラスには、コンピュータがサスペンドやハイバネート状態になっても指定時間経過後に自動復帰させる機能が用意されています。
この機能を利用すれば、サーバが空いている時間帯を利用してのダウンロードなどの待ち時間の長い自動処理を行う際に、予定時刻を待っている間コンピュータを起動したままにしておく必要が無くなり、電力を節約できます。
この機能を利用するには、Timerオブジェクトのコンストラクタで第4引数にtrueを指定します。Timerの使用方法については、同梱のdoc\base_task.txtを参照してください。

復帰とは逆に、スクリプト上からサスペンドやハイバネートを実行するためのメソッドも用意されています。これらは「System.suspend()」や「System.hibernate()」というSystemクラスのメソッドとなっています。
また、サスペンドやハイバネート状態に移行し、指定時間後に自動復帰するという処理を行う「System.suspendFor()」や「System.hibernateFor()」というメソッドも用意されています。これらの機能の説明は、doc\base_main.txtにあります。

なお、タイマーによる復帰機能では、タイマーで指定した時間に復帰処理が始まるため、復帰が完了して予約された処理が実行されるまでには数秒~数十秒のタイムラグがあることに注意しなければなりません。
テレビの自動録画のように遅れることが許されない処理では、予約実行のタイマーとは別に、予定時刻の1~2分前に自動復帰させるためのタイマーをセットしておくとよいでしょう。
この場合、「System.awake()」というメソッドを使用すれば、単にサスペンド・ハイバネートから復帰するだけのタイマーを生成できます。

2010/09/21

プロセスのCPU使用率を監視して自動処理

先日の更新で、CPUの使用状況などを取得するためのクラスを提供する「SystemMonitor」ユニットが追加されました。
このユニットには、「CPU」、「ProcessCPU」、「Network」、「PerformanceCounter」の4つのクラスが用意されています。
「CPU」クラスでは、システム全体のCPU使用率が取得できます。マルチプロセッサの個別の稼働状況も取得可能です。
「ProcessCPU」クラスでは、指定のプロセスのCPU使用率を取得できます。
「Network」は、ネットワークインターフェイスの転送量を取得するクラスです。複数のネットワークインターフェイスの個別の転送量も取得できます。
他にも、「PerformanceCounter」を使うことで、HDDの読み書き量など様々な情報を取得できます。
また、標準クラスである「System」には「memory」メンバとしてシステムのメモリ使用状況を取得するメンバが追加された他、以前からProcessインスタンスの「pagefileUsage」プロパティや「workingSetSize」プロパティでプロセスごとのメモリ使用状況を取得可能になっています。

これらの機能は、タスクマネージャのような情報表示だけでなく、自動処理を進める条件などとしても役立つでしょう。
例えば、動画のエンコードなどの時間のかかる処理が終ってから別の処理を自動実行させたいけれどエンコードソフトがプロセスの存続やウィンドウのテキストなどによる終了判定がしにくい仕様になっている場合に、プロセスのCPU使用率が低くなった時点で処理完了とみなすといった具合です。

このような場合、以下の例のようなスクリプトで、処理の完了まで待機させることが出来ます。
var p=Process.find("VirtualDub.exe");
try{
    var mon=new (require('SystemMonitor').ProcessCPU)(p);
    sleep(1000);
    while(mon.get()>0.05){
        sleep(1000);
    }
}finally{
    free(mon);
}
sleep(10000);
//以降にエンコード終了後の処理を記述

最初の行で、監視対象となるProcessオブジェクトを取得しています。
この例では、既に実行中のプロセスを取得する「Process.find()」を使っていますが、「Process.create()」でプロセスの起動から自動化してもよいでしょう。
「var mon=new (require('SystemMonitor').ProcessCPU)(p);」で、そのプロセスのCPU使用率を取得するためのProcessCPUオブジェクトを生成しています。
プロセスのCPU使用率を取得するには、このオブジェクトの「get()」メソッドを呼び出します。
このメソッドは、前回呼び出し時かインスタンス生成時から今回呼び出し時までの期間のCPU使用率を返すので、インスタンス後に即座に呼び出してしまうと正常な値が取得できないため、最初のget()呼び出しの前にもsleep()が呼び出されるようにしておく必要があります。
get()の返り値は0~1の間の小数となるので、上記の例ではCPU使用率が5%以下になるまでループし続けることになります。
CPU使用率が低くなった直後は、まだファイルへの書き込みなどの処理が行われている可能性があるので、数秒程度sleep()してから次の処理に進むようにするとよいでしょう。
なお、「free(mon)」は、監視オブジェクトで使用したリソースを解放するための処理ですが、一連の処理を実行してすぐに終了するタイプのスクリプトでは、省略しても問題は無いでしょう。

なお、CPUやNetwork、PerformanceCounterクラスも、インスタンスを生成してget()で値を取得するという流れはProcessCPUと同じです。
コンストラクタに渡す引数やget()が返す内容などの詳しい仕様は、同梱のdoc\SystemMonitor.txtを参照してください。