有没有办法获取与javaw.exe关联的java应用程序的名称?基本上我需要编写一个工具,检查(每天)我们的服务器上是否运行了特定的Java应用程序(如果不是,该工具会给我发电子邮件)。
我想在C#中做到这一点......但如果没有办法,我会接受其他建议。
我已经阅读了这个问题265794但更多的是关于修改java应用程序本身... 所有 java应用程序真的显示为javaw.ex,除非'wrapped'??
答案 0 :(得分:3)
结帐jps。这将列出系统上运行的VM,并标识调用的jar文件或类。
答案 1 :(得分:2)
我已经使用以下函数通过传入标识命令行参数来查找java程序,例如java可执行文件的路径和调用的类,或者可能是jar名称或属性定义,或者只是为了确定。获得进程ID后,使用 Process.GetProcessByValue(id)创建进程很简单,但您的代码不需要,只需检查返回的 id.HasValue < / em>的
/// <summary>
/// Return the first process id with matching values in the command line.
/// </summary>
/// <param name="args">
/// Values in the command line to match (case insensitive).
/// </param>
/// <returns>
/// The process id of the first matching process found; null on no match.
/// </returns>
public static int? ProcessIdOf(params string[] args)
{
using (var mos = new ManagementObjectSearcher(
"SELECT ProcessId,CommandLine FROM Win32_Process"))
{
foreach (ManagementObject mo in mos.Get())
{
var commandLine = (string)mo["CommandLine"] ?? string.Empty;
for (int i = 0;; ++i)
{
if (i == args.Length)
{
return int.Parse(mo["ProcessId"].ToString());
}
if (commandLine.IndexOf(
args[i],
StringComparison.InvariantCultureIgnoreCase) == -1)
{
break;
}
}
}
}
return null;
}
此代码中的一些奇怪之处 - 我不使用 SELECT x,y FROM z WHERE y LIKE“%z%”构造因为我不想打扰转义转义字符。另外,我真的不知道ProcessId的类型是什么,所以我只是将它转换为字符串并将其解析为int - 我想我试图对int进行未经检查的强制转换并抛出异常(来自{{3})它应该是一个uin32)。上面的代码可以工作。
答案 2 :(得分:0)
好吧,主类作为命令行参数传递给javaw,对吧?因此,如果您使用this SO post中的信息,您应该能够找到它正在运行的内容。
答案 3 :(得分:0)
您可以在此文件夹下找到正在运行的java应用程序列表: 的 系统临时文件夹 强> / hsperfdata_的 用户 强> 其中 system-temp-folder 是系统临时文件夹的路径, 用户 是运行该系统的用户处理。当java进程启动时,它会在该文件夹中创建一个文件,其中process-id为文件名。每个文件都包含二进制数据(包括进程名称,我认为)。但是,我认为很难在C#中读取该二进制文件。要查找进程名称,您有两种不同的解决方案: 首先,您可以使用C#和系统调用来查找进程名称(我不知道如何在C#中执行此操作) 其次,如果您有权访问jdk文件夹,则可以运行jps并获取输出。实际上,jps读取我已经提到的文件并将一些人类可读数据写入控制台。
答案 4 :(得分:0)
我同意mheyman的看法 我修改了一些他的代码
使用(var mos = new ManagementObjectSearcher( “SELECT * FROM Win32_Process”))
我使用了“select *”