【问题标题】:How can I set the process name for a Java-program? [duplicate]如何为 Java 程序设置进程名称? [复制]
【发布时间】:2010-11-06 15:12:48
【问题描述】:

如果一个Java程序被启动,它会在系统进程-监视器中获得名称java。许多Java程序很难区分。因此,如果存在一种方法来设置名称,那将是很好的,它将显示在进程监视器中。我知道这在不同的操作系统上可能会有所不同。

一个简单的方法是,如果 java-interpreter 支持一个开关来设置名称,像这样:

java -processname MyProgram -jar MyProgram

但我找不到这样的开关,所以它可能不存在。在 Java 中设置进程名称的 API 也可以。

那么,你有什么建议吗?

【问题讨论】:

    标签: java process


    【解决方案1】:

    我不知道这是否可能,但您可以使用 JDK 附带的名为“jps”的命令行工具。就像 *nix ps,但只是 Java 程序。 jps -v 显示您传递给 java 的所有参数。

    另外,我看到人们通过在 args 中添加一个未使用的 -Dmyprocessname 来为他们的 java 进程附加一个“进程名称”。

    【讨论】:

    • 不完全是我问的答案,但正是我的问题的正确答案。谢谢。 :-)
    • 由于缺少 setproctitle,这是一个聪明的解决方案。荣誉。
    • 我也在寻找类似的选择。但是这个答案对我来说并不清楚。有人可以解释一下如何设置进程名称。我看到有一个名为“-D=value”的选项。我们需要使用这个选项吗?谢谢。
    • +1 表示 -D 的想法,没有比这更快或更简单的了
    • 似乎无法在 Windows 中运行。正确的命令是什么?
    【解决方案2】:

    您可以使用LD_PRELOAD shim 执行此操作:https://github.com/airlift/procname

    当进程启动时,shim 只调用 Linux 特定的prctl()

    static void __attribute__ ((constructor)) procname_init()
    {
       prctl(PR_SET_NAME, "myname");
    }
    

    调用必须发生在主线程上,因此不可能从 Java 甚至使用 JVMTI 代理执行此操作,因为这些调用发生在不同的线程上。

    【讨论】:

    • 这非常有效,而且比这里的大多数方法更简单
    • 如果代码获得 MIT、Apache 或其他类似许可协议的许可,我会考虑使用此代码。
    • 这段代码非常琐碎(它只调用一个函数),它甚至看起来都没有版权。请考虑它是公共领域。如果你愿意,我可以添加一个 LICENSE 文件。
    【解决方案3】:

    主要有两种方法:一种如前所述:使用Launch4j、WinRun4J等工具创建原生Windows启动器。

    另一种似乎更好的方法是使用 Apache Procrun 将 java 应用程序包装为 Windows 服务。在安装服务过程中,我们可以给该进程起一个有意义的名字,比如OurApp.exe。

    我们需要做的就是将 prunsrv.exe 重命名为 OurApp.exe,并将我们的 install|start|stop|uninstall 服务脚本中出现的每个 prunsrv.exe 替换为 MyApp.exe。

    查看更多来自Using Apache Procrun to Rename Process Name of a Java Program in Windows

    【讨论】:

    • Launch4J 不能解决问题。他们禁用了重命名进程的能力。此外,它不考虑多进程应用程序,例如在运行 javaw 和 browsercore 时。
    【解决方案4】:

    正如@omerkudat 所说:

    jps -v
    

    打印出所有 java 进程 {processID, params list} 如果参数列表不足以识别您需要的应​​用程序, 在运行它们时尝试添加一些虚拟参数:

    java -Dname=myApp -cp  myApp.jar some.client.main.MainFrame
    

    这将打印如下:

    7780 MainFrame -Dname=myApp
    

    您可以使用进程 ID 来杀死/监视它。

    【讨论】:

    • 我更喜欢jps -l,因为它显示了应用程序的完整包名
    【解决方案5】:

    你最好的选择是像 launch4j http://launch4j.sourceforge.net/

    在 sun bugtracker 中记录了一个错误,但它不是高优先级 http://bugs.sun.com/view_bug.do?bug_id=6299778

    【讨论】:

      【解决方案6】:

      当我第一次读到这篇文章时,改变进程名称的想法让我觉得不可能。但是,根据this ancient thread on the sun forum,您可以在 JVM 可执行文件周围使用 C++ 包装器来实现此目的。

      坦率地说,我想知道您真正的问题是什么,因为我猜想有一个更标准的解决方案,然后尝试更改进程名称。

      【讨论】:

      • 如果你不得不杀死你的应用程序并且有几个 Java 应用程序在运行,那将会有点失败。
      • 你说得对,omerkudat 提到的 jps-command 解决了问题,无需重命名进程。
      • 创建一个小的原生 JNI 包装器来启动应用程序也很容易。对于我们这些进行 Windows 部署的人来说,它允许 JVM 的自动配置、自定义图标等......这真的不难做到。
      • 像往常一样,旧链接被删除了。
      • @pdem 看到这个问题:stackoverflow.com/questions/33186661/… 要点是使用launch4j。我很抱歉做出只是一个链接的答案。我还年轻,不知道更好。
      【解决方案7】:

      如果您想使用不同的进程名称,则必须创建自己的二进制文件以使用 JSmooth 之类的名称启动 Java 应用程序。

      Look at this question 讨论创建此类二进制文件。

      【讨论】:

        【解决方案8】:

        这是因为 Java 应用程序实际上不是可执行的,它们由 Java 虚拟机运行,这就是 java 出现在进程监视器中的原因,它是应用程序的主机。

        LimeWire 之类的东西确实可以,但我认为这更多取决于 GCJ - http://gcc.gnu.org/java/

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-07-27
          • 1970-01-01
          • 2014-11-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-27
          相关资源
          最近更新 更多