diff --git a/src/Tgstation.Server.Host/System/Process.cs b/src/Tgstation.Server.Host/System/Process.cs index 404d96fb36..192729e89a 100644 --- a/src/Tgstation.Server.Host/System/Process.cs +++ b/src/Tgstation.Server.Host/System/Process.cs @@ -42,6 +42,12 @@ namespace Tgstation.Server.Host.System /// readonly CancellationTokenSource readerCts; + /// + /// The . + /// + /// We keep this to prevent .NET from closing the real handle too soon. See https://stackoverflow.com/a/47656845 + readonly SafeProcessHandle safeHandle; + /// /// The resulting in the process' standard output/error text. /// @@ -69,6 +75,7 @@ namespace Tgstation.Server.Host.System this.handle = handle ?? throw new ArgumentNullException(nameof(handle)); // Do this fast because the runtime will bitch if we try to access it after it ends + safeHandle = handle.SafeHandle; Id = handle.Id; this.readerCts = readerCts; @@ -115,6 +122,7 @@ namespace Tgstation.Server.Host.System if (readTask != null) await readTask; + safeHandle.Dispose(); handle.Dispose(); }