.NET ランタイムで既定の終了シグナル ハンドラーが提供されなくなりました

Unix システムでは、.NET ランタイムは既定の SIGTERM シグナル ハンドラーを提供しなくなりました。 Windows では、.NET ランタイムは、Unix CTRL_SHUTDOWN_EVENTおよび CTRL_CLOSE_EVENT シグナルと同等のSIGTERMおよびSIGHUPシグナルの既定のハンドラーを提供しなくなりました。

この変更により、終了シグナル処理の動作は、.NET Framework および従来の Mono ランタイムで使用された動作に戻ります。

導入されたバージョン

.NET 10

以前の動作

以前は、.NET ランタイムによって登録された終了シグナル ハンドラーは、既定でグレースフル アプリケーションの終了をトリガーしました。 AppDomain.ProcessExit および AssemblyLoadContext.Unloading イベントは、アプリケーションが終了する前に発生しました。

新しい動作

.NET 10 以降、.NET ランタイムはオペレーティング システムによって提供される終了シグナル処理をオーバーライドしません。 オペレーティング システムによって提供される一般的な既定の終了シグナル ハンドラーは、アプリケーションを直ちに終了します。 AppDomain.ProcessExit と AssemblyLoadContext.Unloading のイベントは発生しません。

破壊的変更の種類

これは動作の 変化です。

変更の理由

既定で .NET ランタイムによって登録された終了シグナル ハンドラーは、一部のアプリ モデル (コンソールやコンテナー化されたアプリケーションなど) では不十分であり、他のアプリ モデル (Windows サービスなど) と互換性がありません。 特定のアプリ モデルに適したシグナル ハンドラーを登録するには、上位レベルのライブラリまたはアプリケーション コードに任せておくことをお勧めします。

  • アプリ モデル固有の懸念事項を処理するために、 HostingHostBuilderExtensions.UseConsoleLifetime などの上位レベルの API を使用する一般的な ASP.NET アプリケーションやアプリケーションに対してアクションは必要ありません。 これらの上位レベルの API は、必要に応じて SIGTERM やその他のシグナルのハンドラーを登録します。

  • 上位レベルのライブラリに依存せずに終了シグナルを処理する場合は、Main API を使用して PosixSignalRegistration.Create メソッドで終了シグナル ハンドラーを作成することで、前の動作をレプリケートできます。

static void Main()
{
    using var termSignalRegistration =
        PosixSignalRegistration.Create(
            PosixSignal.SIGTERM,
            (_) => Environment.Exit(0));

    // Replicates the previous behavior on Windows
    using var sigHupSignalRegistration =
        PosixSignalRegistration.Create(
            PosixSignal.SIGHUP,
            (_) => Environment.Exit(0));

    // Your application code here
}

影響を受ける API