gpt4 book ai didi

java - 从 C# 关闭 Java 进程(在 Windows 上)

转载 作者:可可西里 更新时间:2023-11-01 10:35:51 26 4
gpt4 key购买 nike

我使用 C# 启动了一个 Java 程序

...
ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.WorkingDirectory = "C:\\path\\to\\jar\\";
startInfo.FileName = "C:\\Windows\\Sysnative\\java.exe";
startInfo.Arguments = "-jar JavaProg.jar";
process = new Process();
process.StartInfo = startInfo;
try {
process.Start();
}
...

然后该进程持续运行,直到我希望它停止。 java 程序有一个关闭 Hook ,应该能够捕获正常的终止信号。例如,如果我从 bat 脚本运行 jar,然后在 cmd 窗口中按 Ctrl+c 将触发关闭 Hook ,但关闭 cmd 窗口将终止进程而不触发关闭 Hook (类似于任务管理器中的 End Process ).

所以为了从 C# 中停止 java 程序,我尝试了:

process.CloseMainWindow();

process.Kill();

CloseMainWindow 方法对java 进程没有影响,Kill 终止它没有触发shutdown hook。那么我该怎么做才能从 C# 代码中优雅地关闭 java 程序呢? [我是否需要在我的 Java 程序中进行修改以拦截 CloseMainWindow 信号?有没有办法在 C# 的 cmd 窗口中模仿 Ctrl+c 的行为?我必须在我的 C# 和 Java 代码之间创建一些通信路径,例如管道或套接字吗?]

附言C# 代码只是 java 代码的包装器,以便在 Windows 上将其作为服务运行(我不能为此目的使用现有工具,例如 RunAsService)。

程序的一般说明:我的 java 程序没有创建任何窗口。它有几个线程,主线程在一个循环中运行,只等待连接,另一个在传入连接上执行特定任务,另一个线程从 Web 服务器定期更新,还有关闭 Hook 。通常,该程序从命令提示符(或 Linux 上的终端)运行,并且仅在首次加载时接受用户输入,之后无需更多用户输入即可再次运行。该程序将日志输出到文件。我的关机 Hook :

...
shutdownHook = new ShutdownHook();
Runtime.getRuntime().addShutdownHook(shutdownHook);
...
class ShutdownHook extends Thread {
public void run() {
// log the shutdown is started
// terminate classes
// interrupt and join the other threads
// log the shutdown is done
}
}

最佳答案

执行此操作的最佳方法是让您的 C# 程序获取 Java 程序的标准输入的句柄。这样,C# 程序可以随时向 Java 程序发送消息,而 Java 程序可以监听要求它结束的消息。

这样做的好处是您无需担心关闭 Hook :程序可以在收到关闭消息时进行任何需要的处理。它也更加灵活:如果稍后您希望 C# 程序发送其他控制消息,可以轻松添加。

在 Java 方面,您需要一个单独的线程来打开 System.in 并从中读取,并在收到正确的消息时执行您需要的任何关闭操作。

在 C# 方面,看起来您想要

startInfo.RedirectStandardInput = true;
startInfo.UseShellExecute = false;

然后当你想发送消息时:

process.StandardInput.WriteLine(...some message...);

(但我是一名 Java 编码员,所以我不确定我是否已经掌握了 C#)。

关于java - 从 C# 关闭 Java 进程(在 Windows 上),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27271506/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com