Docker Containerのモノラルで.Net 4.6.1を実行しているコンソールアプリケーションがあり、うまく動作します。アプリケーションをさらに開発するときには、NugetパッケージMono.Posixを使用してUNIXシグナルに応答する方法を検討しています。MonoでUnixSignalを使用するとSystem.ArgumentExceptionがスローされる
Mono documentationによれば、UnixSignal処理は別のスレッドで実行することをお勧めします。
だから私は、次のコードのようにこれをやろうとしている:アプリケーションを起動するときに
public void Run()
{
var signalHandler = new Thread(new ThreadStart(ListenToSignal));
signalHandler.Start();
}
private void ListenToSignal()
{
var signals = new List<UnixSignal>() {
new UnixSignal (Mono.Unix.Native.Signum.SIGHUP),
new UnixSignal (Mono.Unix.Native.Signum.SIGINT),
new UnixSignal (Mono.Unix.Native.Signum.SIGQUIT),
new UnixSignal (Mono.Unix.Native.Signum.SIGTERM)
};
int index = UnixSignal.WaitAny(signals.ToArray());
var signal = signals[index].Signum;
Console.WriteLine($"Terminate signal was called: {signal}");
}
それはArgrumentException
をスロー:
未処理の例外:System.ArgumentExceptionの:信号を処理することができません。 パラメータ名:Mono.Unix.UnixSignal..ctor(signum signum)のsignum < 0x40433de0 + 0x00097>:0(wrapper remoting-invoke-with-check)Mono.Unix.UnixSignal:.ctor に MangoFareScrapingGenericClient.Scraping.ListenToSignal()< 0x404339e0 + 0x00117>で(Mono.Unix.Native.Signum):でSystem.Threading.ThreadHelper.ThreadStart_Contextで0(System.Objectの 状態)< 0x7f20f10b1010 + 0x00099> System.Threading.ExecutionContextで0:0 System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContextのExecutionContext、 System.Threading.ContextCallbackコールバック、System.Objectの状態、 ブールpreserveSyncCtx)< 0x7f20f10af850 + 0x0016e>中で.Run (System.Threading.ExecutionContext executionContext、 System.Threading.ContextCallbackコールバック、System.Objectの状態、 ブールpreserveSyncCtx)< 0x7f20f10af820 + 0x00020>に0でSystem.Threading.ExecutionContext.Run (System.Threading.ExecutionContextのExecutionContext、 System.Threading.ContextCallbackコールバック、System.Objectの状態) < 0x7f20f10af770 + 0x00059>で:中 System.Threading.ThreadHelper.ThreadStart()< 0x7f20f10b11d0 + 0x0002e>で0:私はそれが
signal_info
のように見える具体的なcodeためのGithub上で見ると0
は例外をスローしますIntPtr.Zero
です。
public UnixSignal (Signum signum)
{
this.signum = NativeConvert.FromSignum (signum);
this.signal_info = install (this.signum);
if (this.signal_info == IntPtr.Zero) {
throw new ArgumentException ("Unable to handle signal", "signum");
}
}
ありがとう、私はテストします!自分のコンテナに特定のシグナルがない理由を知っていますか?私は公式のMono/Xamarin画像から最新のものを使用しています。 – Hypnobrew
@Merryweather N Clue ..、それはDockerの問題、Monoの問題、UbuntuのDockerなどである可能性があります。それらを1つずつテストして、あなたが得たものを見て、質問を更新してください。 ;-) – SushiHangover
@Merryweather私は、Mono内のそれらのシグナルがUbuntu(non-docker)、OS-X、様々なDebian distosなどでうまく動作することを知っています...再び、私はそれがDockerに関係するものであると仮定していますその信号をインストールすることができます... – SushiHangover