我编写了一个 C# NET 应用程序(作为服务运行的控制台应用程序)来管理 Java 进程(Minecraft 游戏服务器),而我们的 Web Panel 软件则管理我的应用程序。当 Java 进程停止时,我的应用程序会自行停止,当我的应用程序停止时,它也会停止 Java 进程。
我遇到的问题是,在进行了大量的错误测试后,我将软件部署到了我们所有的机器上,但我们似乎错过了一个错误,它有时不会关闭 Java 进程。这个错误非常可怕,因为 Web 软件尝试启动我的应用程序,我的应用程序尝试启动 Java 进程,但由于无法绑定(bind) IP(因为旧进程保持打开状态)而失败,我们最终遇到了 15-30 个错误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 进程每隔一段时间运行一次,而我无法在本地重现。
最佳答案
好吧,你没有提出任何问题,我猜你想询问进程可以关闭的其他方式,以便你可以拦截它并确保 Java 进程终止。简单地说:这是不可能的(一般而言)。
看看你自己的代码:你正在对 Minecraft 做同样的事情:调用 TerminateProcess 会导致目标进程立即终止,而没有任何清理的机会。如果有人打电话 TerminateProcess对于您(例如,用户从任务管理器终止进程),您的进程会立即终止。
此外,一些致命异常是无法捕获的,例如当你的进程在 stack overflow 上终止时,你没有被告知,只是终止了。
我猜你需要创建另一个进程,监视你的进程......(或者重新思考整个架构,创建和终止进程,特别是使用 TerminateProcess,对我来说似乎有点粗糙。)
关于C# NET 应用程序未关闭 Java 进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6908469/