【问题标题】:C# NET Application not shutting down Java ProcessC# NET 应用程序未关闭 Java 进程
【发布时间】:2011-08-02 07:13:57
【问题描述】:

我编写了一个管理 Java 进程(Minecraft 游戏服务器)的 C# NET 应用程序(作为服务运行的控制台应用程序),而我们的 Web 面板软件管理我的应用程序。当 Java 进程停止时,我的应用程序会自行停止,当我的应用程序停止时,它会停止 Java 进程。

我遇到的问题是,我在进行了广泛的错误测试后将软件部署到了我们所有的机器上,但似乎我们错过了一个错误,它有时不会关闭 Java 进程。这个错误很可怕,因为 Web 软件尝试启动我的应用程序,我的应用程序尝试启动 Java 进程,但由于它无法 IP 绑定而失败(因为旧进程保持打开状态),我们最终得到 15-30 个错误Java 进程正在运行。

  • 我正在使用 CurrentDomain_UnhandledException 来捕获应用程序的崩溃并调用 TerminateProcess()。
  • 我正在使用 CtrlTypes.CTRL_C_EVENTCtrlTypes.CTRL_CLOSE_EVENT 来检测我的应用程序正在关闭,这也调用了 TerminateProcess() 函数。

以下两种方法我都试过了……

static void TerminateProcess()
{
    log.LogMessage("Minecraft Process Shutdown.");
    SendProcessCmd("stop");
}

    static void TerminateProcess()
    {
        log.LogMessage("Minecraft Process Shutdown.");
        minecraftProcess.Kill();
    }

但是,我似乎错过了关闭 C# 应用程序的另一种方式,因为这两种方式似乎都会让 Java 进程每隔一段时间运行一次,而我无法在本地重现。

【问题讨论】:

  • 你的意思是 log.LogMessage("Minecraft Process Shutdown.");不叫?也许服务包装器有问题?相反,将您的应用程序修改为既是服务又是控制台
  • 它似乎总是被调用,但似乎并不总是停止该过程。您能解释一下服务和控制台的含义吗?

标签: c# java .net process kill


【解决方案1】:

好吧,您没有提出任何问题,我猜您想询问可以关闭进程的其他方法,以便您可以拦截它并确保 Java 进程终止。简单地说:这是不可能的(完全概括)。

看看你自己的代码:你对 Minecraft 做的事情完全一样:调用 TerminateProcess 会导致目标进程立即终止,没有任何清理的机会。如果有人对您调用 TerminateProcess(例如,用户从任务管理器中终止进程),您的进程将立即终止。

此外,一些致命异常是无法捕获的,例如当您的进程在 stack overflow 上终止时,您不会被告知,只是被终止。

我猜你需要创建另一个进程,监视你的进程……(或者重新考虑整个架构,创建和终止进程,尤其是使用 TerminateProcess,对我来说似乎有点粗糙。)

【讨论】:

  • 在我启动 Java 进程后,我让我的进程打开一段时间(minecraftProcess.HasExited == false),这似乎工作正常。最好我能告诉我的总是在返回 true 时关闭。有没有更干净的方法来关闭 Java 进程而不是在其上使用 Kill()?
  • "Stop" 是用于正常关闭进程的命令。我假设最好的方法可能是发出“停止”,然后休眠 X 秒,检查它是否仍在运行,如果是,则将其杀死。这会是最好的方法吗?
  • 没有单一的通用方法可以“要求”另一个进程干净地终止。如果“停止”是您特定情况下的方法,那么是的,一定要尝试,只有当它不起作用时,才使用 Kill。 (另请注意,使用while(something); 进行忙碌等待并不是一种好的编程风格。请使用process.WaitForExit(timeout)。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-09
  • 2012-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多