我正在尝试开发一个日志文件看门狗C#服务来重启Java应用程序。
此Java应用程序运行特殊的通信程序,并将收集的数据写入日志文件。它目前正在使用批处理文件脚本启动。
我希望我的C#服务监视日志文件是否使用新数据进行更新。如果没有获得新数据,我想重新启动Java应用程序。
我在网上找到了关于在C#应用程序中调用批处理脚本并检查文件何时被修改的材料,但我想知道它们是否是使用C#应用程序终止当前运行的Java程序的方法? Java程序名称是javaw.exe,但它们是在此计算机上运行的其他Java程序,因此它不是唯一的。有没有人知道如何做到这一点?
答案 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并终止该进程。