2014年9月9日火曜日

並列処理の話(その2) Windowsでコマンドを並列実行する(後編)

こんにちは。大須賀です。

前回は、STARTコマンドでコンソールコマンドを並列動作させる方法を解説しました。



今回は、複数並列動作させたコマンドの終了待ちをする方法を解説します。
起動されたコマンドは、Windows内でプロセスという単位で実行されています。プロセスが動作中かどうかを判断するためには、プロセスIDが必要です。しかし、STARTコマンドは起動したプロセスのプロセスIDを返してくれません。
そこで、Windowsに標準装備されている「WMI(Windows Management Instruction)」と言う機能を使用します。WMIを制御するコマンドは「wmic」です。
起動してみましょう。


C:\Users\osuga>wmic process create “tree.com c:\”
(Win32_Process)->Create() を実行しています
メソッドが正しく実行しました。
出力パラメーター
instance of __PARAMETERS
{
ProcessId = 1780;
ReturnValue = 0;
};

  • treeコマンドはEXEではなくCOMなので、「tree」だけでは動きません。
  • 「tree.com c:\」をひとかたまりのパラメータとしてwmicに認識させるため、ダブルクォートで括ってやります。

正常に起動された場合、ProccessIdが表示され、ReturnValueは0になります。
次に、このProcessIdが稼働中かどうかチェックします。

C:\Users\osuga>wmic process where ROCESSID=1780) GET Caption
利用できるインスタンスがありません。


のんびりしていてコマンドが終わってしまったようです。
今度はtree実行中に急いでコマンドを打ちます。

C:\Users\osuga>wmic process create “tree.com c:\”
(Win32_Process)->Create() を実行しています
メソッドが正しく実行しました。
出力パラメーター
instance of __PARAMETERS
{
ProcessId = 12868;
ReturnValue = 0;
};

C:\Users\osuga>wmic process where (PROCESSID=12868) GET Caption
Caption
tree.com

  • 「GET Caption」がないと、いろんな情報がたくさん出て来てしまうので、Caotion(コマンド名)だけを表示するようにします。

Captionというカラムにtree.comというコマンド名が表示されました。どうやら、Captionという文字列が表示されればプロセスは生きていると考えて良さそうです。
この実験の結果から、バッチを作成してみます。

それでは、新しいバッチファイルを作成し、次の文を入力してください。

C:\Users\osuga>notepad tst2.bat





実行すると、tree.comが終了するまでうまく待ってくれているようです。
しかし、この方法では、複数のプロセスを待てないので、もう一ひねりして、複数のプロセスを待つようにします。



プロセスの存在チェックで、プロセスIDだけを表示し、合致するものがある間はループを続けるようにしました。(この場合、DELIMSは必要ないですね)
一つ目と二つ目のプロセスが直書きで、ちょっとダサいですが、実行できることはわかっていただけると思います。

この方法の唯一の問題点は、実行コマンドの終了コードが取得できないということです。


さて、ちょっとオマケなのですが、このWMICというコマンド。パラメータに「/NODE:”192.168.10.1”」というように別のマシンのIPアドレスかマシン名を入れると、リモートでのプロセス実行と終了監視ができます。実行ユーザーの権限などまだ考慮することはありますが、Unixのrshellのような事ができるので、試してみたらいかがでしょうか。 


0 件のコメント:

コメントを投稿