以编程方式(在C#中)从javaw.exe进程获取java应用程序名称?

时间:2009-08-14 17:22:04

标签: c# java process

有没有办法获取与javaw.exe关联的java应用程序的名称?基本上我需要编写一个工具,检查(每天)我们的服务器上是否运行了特定的Java应用程序(如果不是,该工具会给我发电子邮件)。

我想在C#中做到这一点......但如果没有办法,我会接受其他建议。

我已经阅读了这个问题265794但更多的是关于修改java应用程序本身... 所有 java应用程序真的显示为javaw.ex,除非'wrapped'??

5 个答案:

答案 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 *”