実行されないサービスの罠

案件: 指紋ダブル認証システム

    

ログイン時に指紋認証画面を表示し、二人の認証がない場合には、Windows を強制的にシャットダウンする。

 

ログイン画面は.netで、シャットダウン処理はWindowsServiceを.net で作成し実現する。

ログイン画面はタスクスケジューラに、Priority0で登録し、ログイン時になるべく早く起動する。また、起動するまでに時間がかかる場合があるので、Win32アプリで「お待ちください」の表示を行う。Win32なので.netより早く表示される。これもタスクスケジューラにPriority0で登録しておく。(一度エクスポートし、XMLを編集しインポートする)※もっと早く画面表示する方法をご存知の方、ご教示ください。

 

さて、サービスは起動と同時に開始され、認証フォームのプロセスが出現するのを監視している。認証フォームにおいて認証がなされると、サービスのその旨が通知される。

認証フォームのプロセスの消失とともに、

認証されていれば、サービスは監視動作を停止する。

認証されていなければ、強制的にシャットダウンする。

のどちらかの処理を行う。

ちなみに、サービスはもう一つのサービスと相互監視を行い、どちらかが止まっている場合に、相手を再起動することにより、サービスの停止を防止する。

 

今回なぜか、強制シャットダウンが行われないことがあった。

たまに再現するが条件が分からない。

たまたまタスクマネージャを開いていると、

認証フォームが二重に起動していた。

画面に表示されているのは一つだけで、もう一つはプロセスにあるだけだったので気づかなかった。

この隠れたプロセスにより、プロセスの消失を検出できず、シャットダウン処理が行われなかったようだ。

Windowsアプリケーションフレームワークプロパティ」の「単一インスタンスのアプリケーションを作成する」にチェックを入れた。

また、タスクスケジューラの「タスクが既に実行中の場合に適用される規則」について、「新しいインスタンスを並列で実行」にしていたのを、「新しいインスタンスを開始しない」に変更した。

この二つの処理により、二重起動しないようになるといいな。

 

※追記 二重起動でもなくて、シャットダウンに失敗することがあるようだ。

原因は不明だが、シャットダウン処理をタイマーで3秒おきに起動するとうまく動作しているような気がする。ちょっと処理を待つのがコツなのか?

今後のテストで安定動作するかどうか。また報告する。

 

シャットダウンが行われなかった時のために、サービスの後に、コンソールアプリで認証が終了しているかチェックし、認証されていなければシャットダウンするダブルシャットダウンとして実装しましたが。はてさてどうなることか。

 

コンソールアプリでの監視の方が確実のようだ。

しかし、シャットダウンまでの時間はサービスの方が上。

ということで、コンソールアプリは100秒待機してから動作するようにしました。

 

この話はここまでにしとうございます。