Stop producing Microsoft.Extensions.Process.Sources
This was only used in the aspnet/AspNetCore repo. so the source for this project is moving to that repo
\n\nCommit migrated from 98522c18fb
This commit is contained in:
parent
090119859b
commit
a053c7e1a4
|
|
@ -1,113 +0,0 @@
|
||||||
// Copyright (c) .NET Foundation. All rights reserved.
|
|
||||||
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Diagnostics;
|
|
||||||
using System.IO;
|
|
||||||
using System.Runtime.InteropServices;
|
|
||||||
|
|
||||||
namespace Microsoft.Extensions.Internal
|
|
||||||
{
|
|
||||||
internal static class ProcessExtensions
|
|
||||||
{
|
|
||||||
private static readonly bool _isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);
|
|
||||||
private static readonly TimeSpan _defaultTimeout = TimeSpan.FromSeconds(30);
|
|
||||||
|
|
||||||
public static void KillTree(this Process process)
|
|
||||||
{
|
|
||||||
process.KillTree(_defaultTimeout);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void KillTree(this Process process, TimeSpan timeout)
|
|
||||||
{
|
|
||||||
string stdout;
|
|
||||||
if (_isWindows)
|
|
||||||
{
|
|
||||||
RunProcessAndWaitForExit(
|
|
||||||
"taskkill",
|
|
||||||
$"/T /F /PID {process.Id}",
|
|
||||||
timeout,
|
|
||||||
out stdout);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
var children = new HashSet<int>();
|
|
||||||
GetAllChildIdsUnix(process.Id, children, timeout);
|
|
||||||
foreach (var childId in children)
|
|
||||||
{
|
|
||||||
KillProcessUnix(childId, timeout);
|
|
||||||
}
|
|
||||||
KillProcessUnix(process.Id, timeout);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void GetAllChildIdsUnix(int parentId, ISet<int> children, TimeSpan timeout)
|
|
||||||
{
|
|
||||||
string stdout;
|
|
||||||
var exitCode = RunProcessAndWaitForExit(
|
|
||||||
"pgrep",
|
|
||||||
$"-P {parentId}",
|
|
||||||
timeout,
|
|
||||||
out stdout);
|
|
||||||
|
|
||||||
if (exitCode == 0 && !string.IsNullOrEmpty(stdout))
|
|
||||||
{
|
|
||||||
using (var reader = new StringReader(stdout))
|
|
||||||
{
|
|
||||||
while (true)
|
|
||||||
{
|
|
||||||
var text = reader.ReadLine();
|
|
||||||
if (text == null)
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
int id;
|
|
||||||
if (int.TryParse(text, out id))
|
|
||||||
{
|
|
||||||
children.Add(id);
|
|
||||||
// Recursively get the children
|
|
||||||
GetAllChildIdsUnix(id, children, timeout);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void KillProcessUnix(int processId, TimeSpan timeout)
|
|
||||||
{
|
|
||||||
string stdout;
|
|
||||||
RunProcessAndWaitForExit(
|
|
||||||
"kill",
|
|
||||||
$"-TERM {processId}",
|
|
||||||
timeout,
|
|
||||||
out stdout);
|
|
||||||
}
|
|
||||||
|
|
||||||
private static int RunProcessAndWaitForExit(string fileName, string arguments, TimeSpan timeout, out string stdout)
|
|
||||||
{
|
|
||||||
var startInfo = new ProcessStartInfo
|
|
||||||
{
|
|
||||||
FileName = fileName,
|
|
||||||
Arguments = arguments,
|
|
||||||
RedirectStandardOutput = true,
|
|
||||||
UseShellExecute = false
|
|
||||||
};
|
|
||||||
|
|
||||||
var process = Process.Start(startInfo);
|
|
||||||
|
|
||||||
stdout = null;
|
|
||||||
if (process.WaitForExit((int)timeout.TotalMilliseconds))
|
|
||||||
{
|
|
||||||
stdout = process.StandardOutput.ReadToEnd();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
process.Kill();
|
|
||||||
}
|
|
||||||
|
|
||||||
return process.ExitCode;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Loading…
Reference in New Issue