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

本文关键字:Java 进程 NET 应用程序 | 更新日期: 2023-09-27 18:04:18

我编写了一个c# . NET应用程序(作为服务运行的控制台应用程序)来管理Java进程(Minecraft Game Server),我们的Web Panel软件管理我的应用程序。当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进程运行,我无法在本地复制。

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

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

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

同样,一些致命的异常是无法捕获的,例如,当你的进程因堆栈溢出而死亡时,你不会被告知,只是被终止。

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