如何正确杀死Linux C#

时间:2017-03-31 11:49:49

标签: c# linux process

我需要一个应用程序来快速杀死所有已启动的程序,到目前为止我已经尝试过这个并且没有一个程序杀死任何这些程序:

    static string[] helpers = new string[] { "/home/user1/server/server.exe", "/home/user1/server/MarginGenerator.exe", "/home/user1/server/nextday/NextDayTicketSystem.exe" };
    static string[] helpers_apps = new string[] { "server", "MarginGenerator", "NextDayTicketSystem" };

    static void Main(string[] args)
    {
        foreach(string s in helpers)
        {
            foreach (var process in Process.GetProcessesByName(s))
            {
                process.Kill();
                Console.WriteLine("Killing: " + s);
            }
        }
        foreach (string s in helpers_apps)
        {
            foreach (var process in Process.GetProcessesByName(s))
            {
                process.Kill();
                Console.WriteLine("Killing: " + s);
            }
        }
        foreach (string s in helpers_apps)
        {
            foreach (var process in Process.GetProcessesByName(s))
            {
                Process[] processlist = Process.GetProcesses();

                foreach (Process theprocess in processlist)
                {

                    if (theprocess.ProcessName.StartsWith(s))
                        theprocess.Kill();
                }
            }
        }
        foreach (string s in helpers_apps)
        {
            Process.GetProcesses().Where(x => x.ProcessName.ToLower()
                                     .StartsWith(s))
                                     .ToList()
                                     .ForEach(x => x.Kill());

                Console.WriteLine("Killing: " + s);
        }
    }

我使用命令启动此应用程序: sudo /home/user1/server/AppsKiller.exe

2 个答案:

答案 0 :(得分:1)

使用Process.Kill()不是推荐的停止进程的方法。它有效地发送SIGKILL信号,该信号会毫不客气地终止该过程。通过仅使用进程名称的pkill命令或带有PID(进程标识符)的kill命令,您将礼貌地通过向其发送SIGTERM信号来请求相关进程停止。有关SIGTERM和SIGKILL的更多信息,请参阅https://www.gnu.org/software/libc/manual/html_node/Termination-Signals.html

简而言之,对于您的用例,一个很好的选择是执行以下操作。

 Process.Start("/bin/bash", " -c 'sudo pkill -f process_name'");

很好地要求流程停止。如果流程没有结束,您可以使用:      Process.Kill();

答案 1 :(得分:0)

这个答案(Get process executed by MONO on GNU/Linux)表明,如果您尝试列出的流程是单声道流程,那么他们的流程名称将是“Mono'并且您需要查看命令行以查看实际情况。