多数のHyper-V VMで実行するカスタム作成のWindowsサービスがあります。実行中の自動テストの一部として、VMは1時間に2、3回再起動されます。サービスは自動起動に設定されており、ほとんどの場合、正常に起動します。
ただし、おそらく5%の時間で、識別できるパターンがないため、サービスの開始に失敗します。失敗すると、イベントビューアーに次のようなエラーが表示されます。
My Service Nameサービスが接続するのを待っている間にタイムアウトになりました(30000ミリ秒)。
この問題が発生した場合、サービスを手動で開始するか、再起動して、サービスを正常に開始できます。
私が理解できないのは、30秒のタイムアウトがコードで発生していないように見えることです。サービスクラスのOnStart()メソッドの最初の行は、「Starting ...」をlog4netログに記録します。サービスの開始に失敗すると、何もログに記録されません。これは、log4netが何らかの理由でログを記録できないか、OnStart()が呼び出される前にタイムアウトが発生することを示しています。
サービスは、XPからWin7および2008R2までのさまざまなOSで実行されます。サービスを遅延開始に設定すると、Vista以降でこれが解決されることがありますが、ハックのように。
これは断続的にシステムの起動中に発生するため、これをリモートデバッグすることはできませんでした。何が起こっているのかを理解するためのさらなる方法については迷っています。何か案は?
私の推測-そしてそれだけです-は、Windowsがサービスの開始に割り当てる30秒以内に.NET Framework自体が開始しないポイントまで、起動中にディスクが激しくスラッシングしているということです。
巧妙な回避策は、サービスを手動で開始するように設定し、アンマネージコードで非常に小さなスタブサービス(C++、Delphiなど)を記述してサービスを開始することです。
別のアプローチは、別のマシンからサービスをリモートで開始することです。 sc
コマンドは仕事をうまくやるはずです。
PowerShellでサービスをインストールしようとすると、イベントビューアーにこのエラーが表示されました。
私が抱えていた問題は、PowerShellスクリプトの「サービス名」と「サービス表示名」の値が、コンソールアプリケーションのprogram.csファイルで指定した値と異なることでした。
私はまた、この種の別の要因が再起動エラーで起動しないことを発見したかもしれないと思います。
WindowsイベントログがOverwrite Events> 7days .. size 512kb ..に設定されている場合、このウィンドウ内で多くのアクティビティが発生しているように見えます。その時間枠。イベントログをはるかに大きなサイズに設定した場合OR必要に応じて上書きする場合、この問題は発生しません
Windows 2016 Serverでも同じ問題が発生しています。
動作しているように見える修正は、サービスを実行しているユーザーをローカルサービスアカウントからローカル管理者に変更することです(原因はわかりません)。
同じエラーに関する私の問題は、サーバーへの.Netインストールが正しく機能していなかったことです。
これを理解するには:
実行中のサービスと同じロジックを備えた小さなコンソールアプリを作成し、コード全体を試してみて、すべてをコンソールにダンプしました。
情報がバブルアップしなかった理由は定かではありませんが、フレームワークのエラーに関する貴重なメッセージを見ました。