如何从C#服务终止Java应用程序

时间:2012-02-13 17:54:27

标签: c# java windows-services batch-file restart

我正在尝试开发一个日志文件看门狗C#服务来重启Java应用程序。

此Java应用程序运行特殊的通信程序,并将收集的数据写入日志文件。它目前正在使用批处理文件脚本启动。

我希望我的C#服务监视日志文件是否使用新数据进行更新。如果没有获得新数据,我想重新启动Java应用程序。

我在网上找到了关于在C#应用程序中调用批处理脚本并检查文件何时被修改的材料,但我想知道它们是否是使用C#应用程序终止当前运行的Java程序的方法? Java程序名称是javaw.exe,但它们是在此计算机上运行的其他Java程序,因此它不是唯一的。有没有人知道如何做到这一点?

2 个答案:

答案 0 :(得分:4)

jps -v是一个Java命令,它详细说明了java正在使用的进程。如果您通过c#进行此调用并将信息传递给字符串,则可以对此进行排序,并准确确定要杀死的进程。

您可以像这样输入输出:

        ProcessStartInfo psi = new ProcessStartInfo("jps", "-v");
        psi.RedirectStandardOutput = true;
        psi.UseShellExecute = false;
        Process p = new Process();
        p.StartInfo = psi;
        p.Start();
        string[] output = p.StandardOutput.ReadToEnd().Split("\n".ToCharArray());

在此之后,您可以轻松地解析您正在运行的Java进程的进程ID和名称。

答案 1 :(得分:2)

优雅地关闭程序,即发送某种礼貌地要求程序终止的信号是一种好习惯。如果您使用的是纯Java环境,我建议您使用JMX,但由于您的看门狗在C#中,您可以使用普通的TCP套接字发送信号。如果您可以修改java程序以便能够接收此类信号,这种方式很好。

kill 任何进程,您可以使用killtask命令或C#API来杀死由PID标识的进程。在Windows上查找运行java进程的PID并不是一项微不足道的任务。但是您可以使用命令jps来打印所有Java进程及其主类名和参数。

您可以使用-D选项将特殊标识符传递给您的java程序: java -Dmyid=1234 MyClass arg1 arg2

将1234(myid)存储在C#程序中。然后,当您要检查java程序是否仍在运行execute jps时,解析其输出,使用参数-Dmyid=1234获取进程,获取jps返回的PID并终止该进程。