2009-07-14 10 views
-1

FlexLMの照会経験がある人はいますか? (最低限)特定のアプリケーションでライセンスが利用できるかどうかを知る必要があります。これまでは、どのプロセスが実行されているかを調べることでこれを実行しましたが、何とかFlexLMに問い合わせることができれば、より洗練されたものになります。C#:FlexLMライセンスマネージャの照会

答えて

3

私はこれを最近実行しました。私はFlexLMライセンスサーバーを照会し、未処理/使用可能なライセンスを発見する必要がありました。私はこのための合理的なAPIを見つけられなかったので、代わりにlmutilを起動し、サーバーに照会するように依頼し、テキストによる結果を徹底的に解析しました。痛みはありましたが、うまくいきました。

lmutil.exeのコピーを見つけて、収集するデータに応じて-aまたは-iスイッチのいずれかを使用して実行します。 -cスイッチを使用して、照会したいサーバーとポートを渡します。はい、FlexLMデーモンが動作しているポートを知る必要があります。標準的なポートがありますが、そのポートでのみ実行するものはありません。

私は定期的にこれを実行するために必要な、と私はデーモンの数千人を照会するために必要なので、私は、アプリケーションからlmutilを運転した - のようなもの:

string portAtHost = "[email protected]"; 
string args = String.Format("lmstat -c {0} -a -i", portAtHost); 
ProcessStartInfo info = new ProcessStartInfo(@"lmutil.exe", args); 
info.WindowStyle = ProcessWindowStyle.Hidden; 
info.UseShellExecute = false; 
info.RedirectStandardOutput = true; 

using (Process p = Process.Start(info)) 
{ 
    string output = p.StandardOutput.ReadToEnd(); 

    // standard output must be read first; wait max 5 minutes 
    if (p.WaitForExit(300000)) 
    { 
     p.WaitForExit(); // per MSDN guidance: Process.WaitForExit Method 
    } 
    else 
    { 
     // kill the lmstat instance and move on 
     log.Warn("lmstat did not exit within timeout period; killing"); 
     p.Kill(); 
     p.WaitForExit(); // Process.Kill() is asynchronous; wait for forced quit 
    } 
    File.WriteAllText("c:\file.lmout", output); 
} 

を...そして、あなたは結果を解析する必要があります。探しているものに応じて、結果の行をスペース文字に分割するのと同じくらい単純なものになる可能性があります。

+0

広告されたとおりに動作します。ありがとう! – Tim

+0

'WaitForExit'コードはあなたが思っていることをしていません。 'p.StandardOutput.ReadToEnd()'は同期です。プロセスが既に終了するまで、実行は次の行に進まない。 10秒間スリープする独自の実行可能ファイルを作成することで試してみて、 'ReadToEnd'を10秒間待つことがわかります。また、 'ReadToEnd'の後に' p.HasExited'をチェックすると、それは常に真であることがわかります。 "リダイレクトされたStandardOutputストリームは、同期または非同期に読み取ることができます.Read、ReadLine、ReadToEndなどのメソッドは、同期読み取り操作を実行します..." – Glazed