【问题标题】:Most ungraceful way to terminate a process (that's being terminated)?终止进程(正在终止)的最不优雅的方式?
【发布时间】:2013-12-19 07:57:00
【问题描述】:

真正终止进程最不优雅的方式是什么?

我尝试使用 Process.Kill (System.Diagnostics),但它有一个缺点,它对我来说毫无用处:

如果在进程当前终止时调用了 Kill 方法,则会为 Access Denied 引发 Win32Exception。

事实上,我正在处理一个应用程序(不是我的),它经常崩溃,甚至卡在终止进程中,只有重新启动才有帮助。

运行 TASKKILL /F /IM ... 也会以“拒绝访问”退出。我还尝试 P/Invoke TerminateProcess()

虽然这个问题可能非常具体,但我会非常感谢您的回答。

【问题讨论】:

  • 如果它已经被终止了,你认为告诉它再次终止会有所帮助的原因是什么?
  • 您可以尝试杀死其各个线程。可能需要 P/Invoke。
  • Process.Kill 应该可以工作。您真的要停止服务吗?你想杀死什么应用程序。
  • 终止进程只能卡在内核模式,例如如果有任何待处理的 I/O 未完成。一旦进程被标记为终止,在不危及内核状态完整性的情况下,就无法再做任何事情了。使用进程资源管理器和/或内核调试器来尝试找出有问题的应用程序究竟是在哪里卡在内核模式中。如果没有任何帮助,请将有问题的应用程序放在虚拟机中并将其关闭。
  • 您已经使用了武器库中所有可用的武器。只重启机器更不优雅。

标签: c# .net windows winapi


【解决方案1】:

在问了这个问题后不久,我就明白了为什么应用程序会以只有重新启动才有帮助的方式挂起 (many thanks to this answer!):Avast Anti-Virus。一旦我从所有工作站中删除了该软件,第 3 方应用程序仍然会崩溃,但在这样做之后它实际上会被终止,因此可以再次运行。

还是谢谢!

【讨论】:

    【解决方案2】:

    看看有没有帮助

    private void Test(){
        KillProcess("notepad");
    }
    
    private void KillProcess(string processName) {
        Process[] appProcesses = Process.GetProcessesByName(processName);
    
        if(appProcesses.Length == 0)
            return;
    
        // Kill and wait for app to exit
        appProcesses[0].Kill();
        appProcesses[0].WaitForExit();
    }
    

    【讨论】:

    • 这对每个应用程序都非常有效,除了我实际尝试终止的应用程序!
    猜你喜欢
    • 2019-08-01
    • 2011-01-04
    • 1970-01-01
    • 1970-01-01
    • 2021-09-15
    • 2016-05-31
    • 1970-01-01
    • 1970-01-01
    • 2017-07-09
    相关资源
    最近更新 更多