2016-07-10 31 views
20

tötlich töten Ich habe eine .NET Core-Konsole-Anwendung erstellt, die als Daemon auf einem Ubuntu 14.04-Rechner läuft.Einen .NET Core-Daemon unter Linux

Ich möchte den Dienst stoppen, ohne es zu zwingen, ein Kill-Ereignis zu behandeln.

Wie kann ich das erreichen?

+4

Möchten Sie Ihren Code freigeben, indem Sie eine .NET Core-Konsole in einen Ubuntu-Daemon verwandeln? – lasseschou

+3

Das einzige, was ich getan habe, war ein Standard-Init-Skript von GitHub kopieren; Die Startfunktion ruft 'dotnet library.dll' und das stop one auf:' kill dotnet library.dll'. – user4388177

Antwort

19

Sie wollen in der Lage sein, einen SIGTERM auf den laufenden Prozess zu senden:

kill <PID> 

Und der Prozess sollte es richtig zur Abschaltung behandeln.

Leider ist .NET Kern nicht gut dokumentiert, aber es ist (in einer anderen Art und Weise von Mono) fähig Unix-Signale verarbeiten. GitHub issue

Wenn Sie Ubuntu mit Upstart, was Sie brauchen, ist ein Init-Skript haben, die das Kill Signal auf einer Stopp-Anforderung sendet: Example init script

eine Abhängigkeit zu Ihrem Projekt hinzufügen .json:

"System.Runtime.Loader": "4.0.0" 

Dies gibt Ihnen die AssemblyLoadContext.

Dann können Sie das SIGTERM Ereignis behandeln:

AssemblyLoadContext.Default.Unloading += MethodInvokedOnSigTerm; 

Hinweis:

Mit Mono, die richtige Art und Weise des Umgangs es durch die UnixSignal wäre: Mono.Unix.Native.Signum .SIGTERM

+0

Dies funktioniert, wenn die Anwendung selbstständig gestoppt wird. Aber wenn der Befehl kill aufgerufen wird, löst er nicht "AssemblyLoadContext.Default.Unloading" aus. Mache ich etwas falsch? – dcinadr

+0

Welche Version von .NET Core verwenden Sie? Ändern Sie den Ladekontext irgendwann? –

+0

Version: 1.0.0-preview2-003121 ... Ich habe auch bemerkt, dass wenn ich "dotnet run" starte, es 2 Prozesse startet. Ich denke, das ist der Grund, warum es nicht funktioniert, weil es einen der Prozesse, aber nicht beide tötet. – dcinadr

9

.NET Core hat sich seit @ Stefano's Antwort vor einem Jahr erheblich weiterentwickelt. In .NET Core 2.0 können Sie nun das bekannte AppDomain.CurrentDomain.ProcessExit-Ereignis anstelle von AssemblyLoadContext.Default.Unloading verwenden. Es funktioniert gut für Konsolenanwendungen unter Linux, auch in Docker.