質問

リモートアプリが失敗またはクラッシュしたかどうかを検出する方法を知っている人はいますか?私はそれが使用できなくなることを意味しています-通常は「応答なし」と表示されますこの場合、タイトルバーに-ただし重要なのは、アプリがまだ実行されていることです。したがって、実行されていないプロセスを見つけるだけでは不十分です。

WMIは、リモートマシンでのSystem.Diagnostics.Process.Respondingの使用をサポートしていません。これらの情報は、Win32_Processでこの種の情報を照会できる他のWMIプロパティではないようです。

役に立ちましたか?

解決

プログラムの「活性」を判断する際に、有用な方法でプログラムが活性であることを定義する側面を測定することが重要です。

いくつかの単純な「プロキシ」アプローチは、その単純さのために表面的に魅力的ですが、基本的に重要な側面を測定しません。

おそらく最も一般的なのは「Is the process alive」です;および「別個のハートビートブロードキャストスレッド」おそらくそれがとても簡単だからです:

bool keepSending = true; // set this to false to shut down the thread
var hb = new Thread(() => 
    {
         while (true)
             SendHeartbeatMessage();   
    }).Start();

ただし、これらの両方に重大な欠陥があります。アプリ内の実際の作業スレッドがロックアップした場合(たとえば、無限ループやデッドロックに陥った場合)、引き続きOKメッセージを送信し続けます。プロセスベースの監視では、実際のタスクを実行しなくなっても、プロセスが「生きている」ことを引き続き確認できます。
メインスレッドで進行状況のテストを重ねることにより、多くの方法でスレッド1を改善できます(大幅に複雑さを増し、スレッド化の問題が発生する可能性があります)。

最適なのは、プログラムによって実行されるタスクを活性チェックの一部にすることです。おそらく、サブタスクが完了するたびにメインスレッドから直接ハートビートする(頻繁に発生しないようにするためのしきい値を使用する)か、単に出力(存在する場合)を見て、入力が出力になっていることを確認します。

内部(プログラム内)と外部(特にプログラムの外部の消費者/ユーザーがいる場合)の両方を検証することをお勧めします。 Webサーバーがある場合:アプリが何らかのイベントループベースのシステムである場合、それを使用しようとします。応答する必要があるイベントをトリガーします(そして出力が正しいことを確認します)。何が行われようと、アクティビティだけでなく、有用な正しい動作が行われていることを確認したいことを常に考慮してください。

プログラムの存在だけでなく、それがアクションであることを確認するほど、チェックの有用性が高まります。内部状態からさらに進んでシステムの詳細を確認します。ボックスで監視プロセスを実行する場合、ローカルループバックのみをチェックできます。ボックスから実行すると、DNSのような忘れられがちな側面を含むネットワークスタックの多くを検証します。

必然的に一般的なソリューションではなく特定のタスクについて本質的に考えているため、これによりチェックが難しくなります。多くの場合、これからの配当はこのアプローチを真剣に検討するのに十分なメリットをもたらすはずです。

他のヒント

アプリがクラッシュしたか、実際に何か役に立つことをしているかどうかを知るのは困難です。

これを考慮してください:

 while(true);

プロセッサは(非常に)ビジーです。そして、これが別のスレッドで行われた場合でも応答するかもしれません。ただし、これはアプリがもう動作していないため、これは本当に望ましくない動作です。

これに取り組む最善の方法は、定期的に(ソフトウェアの特定のポイントで)特定のカウンターを追加し、これらをブロードキャストすることです。ウォッチドッグアプリはこれらのブロードキャストをリッスンすることができ、それらが到着しないか意味をなさない場合(カウンターが追加されない場合)、プロセスを強制終了して再起動できます。

ブロードキャストは複数の方法で実行できます。最も簡単なのは、単にカウンターをファイルに書き込むことです(書き込み時にファイルがロックされていることを確認して、読み取りプロセスが正確に同時に読み取っているときにハーフマングルファイルを取得しないようにしてください)

より高度な方法は、名前付きパイプを使用するか、ソケットを使用することです。この場合、UDPソケットのセットアップと使用は非常に簡単です。ローカルネットワークではほとんど発生しないため、「パケット損失」については心配しないでください

ポーリングメカニズムを使用して、リモートアプリケーションのステータスを定期的に確認できます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top