首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何杀死Windows、Linux和MacOS - C# (.Net内核)中特定端口进程

如何杀死Windows、Linux和MacOS - C# (.Net内核)中特定端口进程
EN

Stack Overflow用户
提问于 2018-07-30 13:06:26
回答 3查看 2.1K关注 0票数 1

我需要杀死进程使用端口8001视窗,Ubuntu和MacOS之前,通过C#代码启动我的应用程序,因为我的应用程序是需要使用所有平台上的8001

所以请给我这个问题的解决方案。

EN

回答 3

Stack Overflow用户

发布于 2018-08-05 00:39:04

以下是C#中的代码示例

使用系统;

使用System.Diagnostics;

使用System.Collections.Generic;

使用System.Text.RegularExpressions;

命名空间解决方案{公共枚举平台{ UNIX,WIN }

代码语言:javascript
复制
public class ProcessUtils
{

    public const string UNIX_PID_REGX = @"\w+\s+(\d+).*";
    public const string WIND_PID_REGX = @".*\s+(\d+)";

    public static void Main(string[] args) {
        Console.WriteLine("Hello World!");

        if (args !=  null && args.Length == 1) {
            findAndKillProcessRuningOn(port: args[0]);
        } else {
            Console.WriteLine("Illegal port option");
        }
    }

    public static void findAndKillProcessRuningOn(string port) {
        List<string> pidList = new List<string>();
        List<string> list = new List<string>();
        switch (getOSName())
        {
            case Platform.UNIX:
                list = findUnixProcess();
                list = filterProcessListBy(processList: list, filter: ":" + port);

                foreach(string pidString in list) {
                    string pid = getPidFrom(pidString: pidString, pattern: UNIX_PID_REGX);

                    if(!String.IsNullOrEmpty(pid)) {
                        pidList.Add(pid);
                    }
                }
                break;

            case Platform.WIN:
                list = findWindowsProcess();
                list = filterProcessListBy(processList: list, filter: ":" + port);

                foreach (string pidString in list)
                {
                    string pid = getPidFrom(pidString: pidString, pattern: WIND_PID_REGX);

                    if (!String.IsNullOrEmpty(pid))
                    {
                        pidList.Add(pid);
                    }
                }
                break;
            default:
                Console.WriteLine("No match found");
                break;
        }

        foreach(string pid in pidList) {
            killProcesBy(pidString: pid);
        }
    }

    public static Platform getOSName() {
        string os = System.Environment.OSVersion.VersionString;
        Console.WriteLine("OS = {0}", os);

        if (os != null && os.ToLower().Contains("unix")) {
            Console.WriteLine("UNXI machine");
            return Platform.UNIX;
        } else {
            Console.WriteLine("Windows machine");
            return Platform.WIN;
        }
    }

    public static void killProcesBy(string pidString) {
        int pid = -1;
        if(pidString !=  null && int.TryParse(s: pidString, result: out pid)){
            Process p = Process.GetProcessById(pid);
            p.Kill();
            Console.WriteLine("Killed pid =" + pidString);
        } else {
            Console.WriteLine("Process not found for pid =" + pidString);
        }

    }

    public static List<String> findUnixProcess() {
        ProcessStartInfo processStart = new ProcessStartInfo();
        processStart.FileName = "bash";
        processStart.Arguments = "-c lsof -i";

        processStart.RedirectStandardOutput = true;
        processStart.UseShellExecute = false;
        processStart.CreateNoWindow = true;

        Process process = new Process();
        process.StartInfo = processStart;
        process.Start();

        String outstr  = process.StandardOutput.ReadToEnd();

        return splitByLineBreak(outstr);
    }

    public static List<String> findWindowsProcess()
    {
        ProcessStartInfo processStart = new ProcessStartInfo();
        processStart.FileName = "netstat.exe";
        processStart.Arguments = "-aon";

        processStart.RedirectStandardOutput = true;
        processStart.UseShellExecute = false;
        processStart.CreateNoWindow = true;

        Process process = new Process();
        process.StartInfo = processStart;
        process.Start();

        String outstr = process.StandardOutput.ReadToEnd();

        return splitByLineBreak(outstr);
    }

    public static List<string> splitByLineBreak(string processLines)
    {
        List<string> processList = new List<string>();

        if (processLines != null)
        {
            string[] list = processLines.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
            processList.AddRange(collection: list);
        }

        return processList;
    }

    public static List<String> filterProcessListBy(List<String> processList, 
                                               String filter) {

        if(processList == null) {
            return new List<string>();
        }

        if(filter == null) {
            return processList;
        }

        return processList.FindAll(i => i != null && i.ToLower().Contains(filter.ToLower()));
    }

    public static String getPidFrom(String pidString, String pattern) {
        MatchCollection matches = Regex.Matches(pidString, pattern);

        if(matches != null && matches.Count > 0) {
            return matches[0].Groups[1].Value;
        }

        return "";
    }
}

}

票数 2
EN

Stack Overflow用户

发布于 2018-07-30 15:01:36

视窗

  • 查找进程ID

代码语言:javascript
复制
- command `netstat -a -b`
- Resource monitor from (Start>>All Programs>>Accessories>>System Tools>>Resource Monitor)

使用以下命令taskkill /PID pid终止

  • 进程

UNIX和MAC

使用kill -9 <process id>命令lsof -i | grep <process id>

  • kill
  • 查找进程ID
票数 1
EN

Stack Overflow用户

发布于 2019-07-31 19:55:32

macOS和Linux上的

这样你就不需要知道PID了;)

代码语言:javascript
复制
sudo kill -9 $(netstat -vanp tcp | grep 8001 | grep -v grep | awk '{print $9}')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51587273

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档