【问题标题】:Programmatically (in C#) get java application name from javaw.exe process?以编程方式(在 C# 中)从 javaw.exe 进程获取 java 应用程序名称?
【发布时间】:2009-08-14 17:22:04
【问题描述】:

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

我想在 C# 中执行此操作...但如果没有办法,我愿意接受其他建议。

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

【问题讨论】:

    标签: c# java process


    【解决方案1】:

    查看jps。这将列出您系统上运行的虚拟机,并识别调用的 jar 文件或类。

    【讨论】:

    • 跟进这个,你知道jps运行需要什么吗?我不想安装整个jdk。但是,如果我只将该 exe 复制到 diff 目录并尝试运行它,则会收到错误“线程“main”java.lang.NoClassDefFoundError: sun/tools/jps/Jps 中的异常”
    【解决方案2】:

    我使用以下函数来查找 java 程序,方法是传入标识命令行参数,例如 java 可执行文件的路径和调用的类,也许是一个 jar 名称或一个或两个属性定义。有了进程 ID 后,使用 Process.GetProcessByValue(id) 创建进程很简单,但您的代码不需要它,只需检查返回的 id.HasValue。

    /// <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 进行未经检查的转换并引发异常(来自here it应该是uin32)。上面的代码有效。

    【讨论】:

    • 命名空间 System.Management.ManagementObjectSearcher,位于 System.Management.dll
    【解决方案3】:

    嗯,主类作为命令行参数传递给 javaw,对吧?因此,如果您使用this SO post 中的信息,您应该能够找出它正在运行的内容。

    【讨论】:

      【解决方案4】:

      您可以在此文件夹下找到正在运行的 java 应用程序列表: 系统临时文件夹/hsperfdata_用户 其中 system-temp-folder 是系统临时文件夹的路径,user 是运行过程。当 java 进程启动时,它会在该文件夹中创建一个文件,并以 process-id 作为文件名。每个文件都包含二进制数据(我认为包括进程名称)。但是,我认为这很难在 C# 中读取该二进制文件。要查找进程名称,您有两种不同的解决方案: 首先,您可以使用C#和系统调用来查找进程名称(我不知道您在C#中如何做到这一点) 其次,如果您有权访问 jdk 文件夹,则可以运行 jps 并获取输出。实际上,jps 会读取我已经提到的文件并将一些人类可读的数据写入控制台。

      【讨论】:

        【解决方案5】:

        我同意我的观点 我对他的代码做了一点修改

        使用 (var mos = new ManagementObjectSearcher( "SELECT * FROM Win32_Process"))

        我用“选择*”

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-08-24
          • 1970-01-01
          • 1970-01-01
          • 2015-10-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-11-15
          相关资源
          最近更新 更多