Dela via


.NET-körningen tillhandahåller inte längre standardsignalhanteraren för SIGTERM

På Unix-system tillhandahåller .NET-körningen inte längre en SIGTERM-standardsignalhanterare. I Windows tillhandahåller .NET-körningen inte längre standardhanterare för signalernaCTRL_CLOSE_EVENT ochCTRL_SHUTDOWN_EVENT, som motsvarar Unix-signalenSIGTERM.

Den här ändringen återställer SIGTERM-signalhanteringsbeteendet till vad det brukade vara i .NET Framework och klassisk Mono-körning.

Version lanserad

.NET 10 Förhandsversion 5

Tidigare beteende

Tidigare utlöste en SIGTERM-signalhanterare som registrerats av .NET-körningen som standard ett graciöst programavslut. AppDomain.ProcessExit och AssemblyLoadContext.Unloading händelser genererades innan programmet avslutades.

Nytt beteende

Från och med .NET 10 åsidosätter .NET-körningen inte SIGTERM-signalhanteringen som tillhandahålls av operativsystemet. Den typiska SIGTERM-signalhanteraren som tillhandahålls av operativsystemet avslutar programmet omedelbart. AppDomain.ProcessExit och AssemblyLoadContext.Unloading händelser aktiveras inte.

Typ av brytande ändring

Det här är en beteendeförändring.

Orsak till ändring

SIGTERM-signalhanteraren som registrerades av .NET-körningen som standard var både otillräcklig för vissa appmodeller (till exempel konsol- och containerbaserade program) och inkompatibla med andra appmodeller (till exempel Windows-tjänster). Det är bättre att lämna det till bibliotek på högre nivå eller programkod för att registrera signalhanterare som är lämpliga för den angivna appmodellen.

  • Ingen åtgärd krävs för typiska ASP.NET program eller program som använder API:er på högre nivå, till exempel HostingHostBuilderExtensions.UseConsoleLifetime för att hantera appmodellspecifika problem. Dessa API:er på högre nivå registrerar hanterare för SIGTERM och andra signaler efter behov.

  • Om du vill hantera SIGTERM-signalen utan att behöva använda bibliotek på högre nivå kan du replikera det tidigare beteendet genom att skapa en SIGTERM-signalhanterare i din Main metod med hjälp av API:et PosixSignalRegistration.Create :

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

    // Your application code here
}

Berörda API:er