C#NET应用程序没有关闭Java进程

时间:2011-08-02 07:13:57

标签: c# java .net process kill

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

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

  • 我正在使用 CurrentDomain_UnhandledException 来捕获应用程序的崩溃并调用TerminateProcess()。
  • 我正在使用 CtrlTypes.CTRL_C_EVENT CtrlTypes.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进程每隔一段时间就会运行,而我无法在本地重现。

1 个答案:

答案 0 :(得分:1)

好吧,你没有说出任何问题,我猜你想要问一个进程可以关闭的其他方法,这样你就可以拦截它并确保Java进程终止。简单地说:这是不可能的(完全一般性)。

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

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

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