web-dev-qa-db-ja.com

Linuxで実行されている.NET Coreデーモンを正常に終了する

Ubuntu 14.04マシンでデーモンとして実行する.NET Coreコンソールアプリケーションを作成しました。

Killイベントを処理できるようにして、サービスを強制せずに停止したい。

どうすればこれを達成できますか?

29
user4388177

[〜#〜] sigterm [〜#〜]を実行中のプロセスに送信できるようにしたい場合:

kill <PID>

そして、プロセスはそれを正しくシャットダウンするように処理する必要があります。

残念ながら。NET Coreは十分に文書化されていませんが、Unixシグナルを処理することができます(とは異なる方法で)モノ)。 GitHubの問題

UbuntuUpstartを使用する場合、必要なのは停止要求でkillシグナルを送信するinitスクリプト: initスクリプトの例

依存関係をproject.jsonに追加します。

"System.Runtime.Loader": "4.0.0"

これにより、AssemblyLoadContextが得られます。

その後、SIGTERMイベントを処理できます。

AssemblyLoadContext.Default.Unloading += MethodInvokedOnSigTerm;

注意:

Monoを使用する場合の正しい処理方法は、UnixSignalMono.Unix.Native.Signum。 SIGTERM

編集:

@Marcが最近の回答で指摘したように、これはこれを達成するための最良の方法ではありません。 From。NET Core 2.0AppDomain.CurrentDomain.ProcessExitはサポートされているイベントです。

26

.NET Coreは、@ Stefanoの1年前の回答以来、かなり進化しています。 .NET Core 2.0では、よく知られているAppDomain.CurrentDomain.ProcessExitイベントの代わりにAssemblyLoadContext.Default.Unloading。 Linuxのコンソールアプリケーション、およびDockerでも正常に機能します。

42
Marc Sigrist