我有一個控制檯應用程序在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_info
是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問題,單聲道問題,Ubuntu上的Docker等等......一個接一個地測試它們,看看你得到了什麼,更新你的問題(或者發佈另一個問題).. .--) – SushiHangover
@Merryweather我知道在Mono中的這些信號在Ubuntu(非docker),OS-X,各種Debian distos等上運行良好......所以我再次假設它是與Docker相關的東西允許該信號被安裝... – SushiHangover