2016-05-03 72 views
0

我有一個控制檯應用程序在Docker容器中的單聲道上運行.Net 4.6.1,它運行良好。進一步開發應用程序時,我正在考慮使用Nuget-package Mono.Posix來響應unix信號。在單引發中使用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)處的符號 < 0x40433de0 + 0x00097> in:0 at(包裝器 遠程調用與檢查)Mono.Unix.UnixSignal:.ctor (Mono.Unix.Native.Signum)在 MangoFareScrapingGenericClient.Scraping.ListenToSignal()< 0x404339e0 + 0x00117>在:0在System.Threading.ThreadHelper.ThreadStart_Context(System.Object的 狀態)< 0x7f20f10b1010 + 0x00099>在: 0在 System.Threading.ExecutionContext.RunInternal (System.Threading.ExecutionContext的ExecutionContext, System.Threading.ContextCallback回調,System.Object的狀態, 布爾preserveSyncCtx)< 0x7f20f10af850 + 0x0016e>中:在System.Threading.ExecutionContext 0 .Run (System.Threading.ExecutionContext executionContext, System.Threading.ContextCallback callback,System.Object state, 布爾preserveSyncCtx)< 0x7f20f10af820 + 0x00020>在:0在System.Threading.ExecutionContext.Run (System.Threading.ExecutionContext的ExecutionContext, System.Threading.ContextCallback回調,System.Object的狀態) < 0x7f20f10af770 + 0x00059>在: 0在 System.Threading.ThreadHelper.ThreadStart()< 0x7f20f10b11d0 + 0x0002e>中:0

如果我期待在Github上針對特定code它看起來像signal_infoIntPtr.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〜(我記得拉請求,因爲我需要在部署的支持)

所以我假設要麼SIGQUITSIGHUP是未能安裝。

,因爲你沒有說哪個信號返回IntPtr.Zero,從而拋出異常,我會嘗試安裝自身各信號發現未在你的Ubuntu泊塢環境中支持的一個。

在這一點上,你可以在直C程序測試信號,以確定它是否運行正常,因爲它可能是在泊塢窗下運行的Mono運行時出現問題。

此外,您可以嘗試/趕上您的UnixSignal.WaitAny並優雅地降低您的信號處理,並寫出有關違規信號的日誌消息。

+0

謝謝,我會測試!你知道爲什麼某個信號在我的容器中不可用嗎?我使用官方Mono/Xamarin圖片中的最新版本。 – Hypnobrew

+0

@Merryweather N clue ..,它可能是一個Docker問題,單聲道問題,Ubuntu上的Docker等等......一個接一個地測試它們,看看你得到了什麼,更新你的問題(或者發佈另一個問題).. .--) – SushiHangover

+0

@Merryweather我知道在Mono中的這些信號在Ubuntu(非docker),OS-X,各種Debian distos等上運行良好......所以我再次假設它是與Docker相關的東西允許該信號被安裝... – SushiHangover

相關問題