C#で書かれたWindowsサービスは、基本的に特定のポートでWeb APIを起動します。サービスは、最初の障害と2番目の障害で再起動するように構成されています。 「後続の失敗」は「何もしない」に設定されています。 このポートが使用される可能性がある場合は、処理されない例外が発生してサービスがクラッシュし、未処理の例外コールバックでダンプファイルが特定のアプリケーションディレクトリに書き込まれます。どんな理由であれ、Windowsは既に複数回クラッシュしたとしても、サービスを何度も再開し続けます。当社のサービスの構造はこのようなものです:WindowsのイベントでクラッシュしてWindowsサービス復旧の「後続の障害」を考慮する
public class WinService : ServiceBase
{
private WebApiHostWrapper _apiHost;
private Thread _workerThread;
public WinService()
{
InitializeComponent();
ServiceName = "MyService";
// register handler for writing dumpfiles
AppDomain.CurrentDomain.UnhandledException += UnhandledExceptions.DomainUnhandledException;
}
protected override void OnStart(string[] args)
{
_workerThread = new Thread(InternalStart) { Name = "StartupThread" };
_workerThread.Start(args);
}
private void InternalStart(object args)
{
if (null == _service)
{
Thread.MemoryBarrier();
_apiHost= new WebApiHostWrapper();
_apiHost.Start((string[])args); // exception here
}
}
protected override void OnStop()
{
if (null != _workerThread)
{
_apiHost.Dispose();
_apiHost= null;
if (!_workerThread.Join(5000))
{
_workerThread.Abort();
}
Thread.MemoryBarrier();
_workerThread = null;
}
}
私は4つのエントリを参照してくださいログ。
- サービスが正常に開始されました。 (ソース:MyServiceで)
- アプリケーションシート....スタックトレースなど(ソース:.NETランタイム)
- 断層アプリケーション名... dllファイルとexeファイル名(ソース:アプリケーションエラー)
- フォルトバケツ、タイプ0 ....(ソース:Windowsエラー報告)
このポートがすでに使用されているシナリオでは、サービスがクラッシュしてシステムがダンプファイルで溢れてしまいます。 Windowsは常に設定から独立してサービスを再起動します。 「後続の障害」を考慮し、サービスを再起動しないためにクラッシュする方法はありますか?
TBH、その後の再起動を避けるためにどのようにわかりません。そのようなテストは自分ではできませんでしたが、あなたのアプリの起動時に、ポートXを使用するアプリのpidを見つけようとする可能性があります。あなたのアプリが実際に起動できるようにするには? – uTeisT
予約済みのポートは、アプリケーションの起動時に発生する可能性のある多くのものの1つに過ぎません。理論的には、起動時にエラーが検出されたときにもクリーンな停止を行うことができますが、これは達成したいことではありません。予期しない停止を引き起こした実際のバグかもしれないので、何が起こったのかを解析するためにダンプファイルを持っていたい。 – Danielku15