2016-05-03 21 views
0

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"); 
    } 
} 

答えて

1

SIGTERMSIGINT支援を〜2013年にドッカーに追加されました(私が展開でそのサポートが必要なので、私はプルリクエストを覚えている)

だから私は、SIGQUITまたはSIGHUPのいずれかをされたと仮定していますインストールに失敗しました。

しかしあなたがIntPtr.Zeroを返すため、例外がスローされた信号言ってなかったので、私はあなたのUbuntuドッカー環境でサポートされていないものを見つけるために独自に信号をインストールしようとするだろう。

この時点で、信号はまっすぐCプログラムでテストして、Dockerで実行中のMonoランタイムで問題が発生する可能性があるため、正常に実行されているかどうかを判断できます。

さらに、UnixSignal.WaitAnyを試してみると、信号処理が正常に機能しなくなり、問題の信号に関するログメッセージが書き込まれます。

+0

ありがとう、私はテストします!自分のコンテナに特定のシグナルがない理由を知っていますか?私は公式のMono/Xamarin画像から最新のものを使用しています。 – Hypnobrew

+0

@Merryweather N Clue ..、それはDockerの問題、Monoの問題、UbuntuのDockerなどである可能性があります。それらを1つずつテストして、あなたが得たものを見て、質問を更新してください。 ;-) – SushiHangover

+0

@Merryweather私は、Mono内のそれらのシグナルがUbuntu(non-docker)、OS-X、様々なDebian distosなどでうまく動作することを知っています...再び、私はそれがDockerに関係するものであると仮定していますその信号をインストールすることができます... – SushiHangover

関連する問題