2016-07-10 82 views
20

Ho creato un'applicazione console .NET Core in esecuzione come demone su una macchina Ubuntu 14.04.Uccidere con grazia un demone .NET Core in esecuzione su Linux

Voglio interrompere il servizio senza forzarlo, essendo in grado di gestire un evento kill.

Come posso ottenere questo risultato?

+4

Cura di condividere il codice: trasformare un'app di console di .NET Core in un demone di Ubuntu? – lasseschou

+3

L'unica cosa che ho fatto è stata copiare uno script init predefinito da GitHub; la funzione di avvio chiama 'dotnet library.dll' e quella di arresto:' kill dotnet library.dll'. – user4388177

risposta

19

si vuole essere in grado di inviare un SIGTERM al processo in esecuzione:

kill <PID> 

E il processo dovrebbe gestire la cosa per spegnere correttamente.

Purtroppo NET Nucleo non è ben documentato, ma è in grado di gestire segnali Unix (in un modo diverso da Mono). GitHub issue

Se si utilizza Ubuntu con Upstart, ciò che è necessario è quello di avere un init script che invia il il segnale uccidere su una richiesta di arresto: Example init script

aggiungere una dipendenza al progetto .json:

"System.Runtime.Loader": "4.0.0" 

Questo vi darà la AssemblyLoadContext.

Quindi è possibile gestire l'evento SIGTERM:

AssemblyLoadContext.Default.Unloading += MethodInvokedOnSigTerm; 

Nota:

Utilizzando Mono, il modo corretto di gestire sarebbe attraverso il UnixSignal: Mono.Unix.Native.Signum .SIGTERM

+0

Funziona se l'applicazione si arresta in modo naturale. Ma se viene chiamato il comando kill, non viene attivato "AssemblyLoadContext.Default.Unloading". Sto facendo qualcosa di sbagliato? – dcinadr

+0

Quale versione di .NET Core stai usando? Stai modificando il contesto di caricamento ad un certo punto? –

+0

Versione: 1.0.0-preview2-003121 ... Ho anche notato che quando eseguo "dotnet run" avvia 2 processi. Penso che questo sia il motivo per cui non funziona perché uccide uno dei processi ma non entrambi. – dcinadr

9

. NET Core si è notevolmente evoluto dalla risposta di @ Stefano un anno fa. In .NET Core 2.0, è ora possibile utilizzare il noto evento AppDomain.CurrentDomain.ProcessExit anziché AssemblyLoadContext.Default.Unloading. Funziona bene per le applicazioni console su Linux, anche in Docker.