【问题标题】:how to change the name of a Java application process?如何更改 Java 应用程序进程的名称?
【发布时间】:2010-10-27 08:07:00
【问题描述】:

在执行 Java 应用程序时,为其指定的进程名称通常是 java.exejavaw.exe。但是我怎样才能让它被我的应用程序的名字调用呢?

【问题讨论】:

标签: java process argv


【解决方案1】:

我需要在 Windows 中解决此问题,以使我能够停止特定的 Java 进程。我已经决定使用 .bat 文件来运行不同的 .jar 文件,.bat 文件的第一行是 TITLE “Name to give the cmd window”,然后当我查看不同的 cmd 窗口时,我可以看到哪个是我想停止的那个,然后通过那个 cmd 窗口按 Ctrl-C。

【讨论】:

    【解决方案2】:

    WinRun4J

    在许多 Java exe 包装器中,自定义 exe 只是一个启动器,并且该进程仍然像通常的 java(w).exe 一样运行。另一方面,在WinRun4J 中,自定义 exe 是运行您的应用程序的进程,因此例如在任务管理器中,您的自定义 exe 就是出现的内容。它支持 32 位和 64 位、控制台和无控制台(以及许多配置选项)。

    【讨论】:

      【解决方案3】:

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

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

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

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

      【讨论】:

      • 很好的解决方案!但仅限 Linux。
      【解决方案4】:

      这是特定于 Windows 的。
      我遇到了同样的问题,我必须使用 taskkill 杀死特定的 java 程序。当我运行 java 程序时,tasklist 显示的是图像名称设置为 java.exe 的同一程序。但是使用 taskkill /F java.exe 杀死它会停止所有其他 Java 应用程序,而不是不需要的预期应用程序。

      所以我使用以下方式运行相同的 java 程序:

      启动“MyProgramName”java java-program..

      这里 start 命令将打开一个新窗口并运行 java 程序,窗口的标题设置为 MyProgramName

      现在要杀死这个 java 程序,请使用以下 taskkill 命令:

      taskkill /fi "MyProgramName"

      您的 Java 程序只会被终止。休息不受影响。

      【讨论】:

      • 谢谢你,这正是我所寻找的。只是一个小评论:taskkill /fi "MyProgramName" 对我不起作用。我必须添加过滤条件:taskkill /fi "WINDOWTITLE eq MyProgramName"
      【解决方案5】:

      假设您真正追求的是一种稍后终止正确进程的方法,那么另一种解决方案是:

      运行ps -ef | grep java,您应该会得到一个如下所示的列表:

       mruser    7518  7505  4 11:37 pts/3    00:00:00 /usr/bin/java -classpath MRD3030_Linked.jar peralex.MyApp
      

      那么pkill -f peralex.MyApp会杀掉正确的进程。

      【讨论】:

      • 请注意,仅当 /remembered/ 命令行未被系统截断时才有效。 Linux 和 Solaris 都对记住的命令行长度有限制(与接受的最大值无关),如果使用较长的类路径,您很容易超过该长度。
      【解决方案6】:

      这些方法适用于运行大量 java 进程的服务器,并且您需要一种快速找到正确 jvm(不使用 jps)的方法。对于应用程序,我认为 launch4j 或其他包装器是可行的方法。

      在 unix 上,如果您是从 shell 脚本启动(至少对于 bash 并且可能对于其他体面的 shell),您可以使用:

      exec -a goodname java ...
      

      启动java并将“goodname”作为第0个参数传递,它将在ps等中显示为进程名称。

      一个可能更好的选择(似乎也适用于top)是创建一个符号链接:ln -s /usr/bin/java /usr/local/bin/kallekula

      windows 中的快捷方式无法解决问题,但 windows vista/7 支持使用mklink 的符号链接。这可能有效,但我没有测试过。我不确定exec -a 是否也适用于 Windows 上的 cygwin bash。

      【讨论】:

      • 这对于启动服务器等很有用,因为它是在启动 shell 脚本中的简单编辑。
      • 不,当我阅读这个问题时,我完全处于 unix 思维中。我已经编辑了答案。
      • 我认为它甚至在 Ubuntu 11.04 上也不起作用。事实证明,它设置了一些名称,但没有设置“根”名称。 ps x 显示指定的名称,htop 默认情况下被告知“显示自定义线程名称, but both show java”。
      • 哦。 'top' 似乎显示了可执行文件的名称(磁盘上文件的名称)。 'ps' 显示命令行的 arg[0]。我认为 top 曾经也表明了这一点,但可能为了提高安全性而对其进行了更改。我想不可能更改到 exe 的链接。但是,始终可以与另一条线路进行软链接。我又更新了答案。
      • @KarlP 如何在构建独立 exe 文件时在 netbeans javafx 项目中更改它?
      【解决方案7】:

      并非所有的 exec 风格都支持 -a 标志。如果你没有,argv0 程序会做类似的事情。

      【讨论】:

      • argv0 默认已安装,argv0 只需使用准备好的参数字符串调用execve(2),其手册包含示例 C 代码。
      【解决方案8】:

      如果您使用的是 Sun JDK,您还可以使用“jps”命令行工具来获取机器上运行的 Java 进程的详细列表。

      【讨论】:

        【解决方案9】:

        除非您在自定义构建的可执行文件中通过 JNI 启动 Java,否则进程名称将始终为 java.exe。

        有几个 java 启动器/包装器可以为您生成这个可执行文件。

        【讨论】:

        • ...即使您要重命名 java.exe?
        【解决方案10】:

        查看launch4j,它是一个可执行包装器,允许您分配可执行名称。

        【讨论】:

        • 该功能已于 2013 年删除:3.1.0-beta2 版本的更改 (20-08-2013) 删除了与较新 Windows 版本不兼容的自定义进程名称功能。
        • 确实,launch4j 不再允许您更改 javaw.exe 进程的名称。但是,如果您使用选项stayalive=true 创建launch4j exe,那么除了javaw.exe 进程之外,您的自定义exe 文件的进程名称将保留在进程列表中。因此,这使用户可以选择通过终止使用您的自定义名称的进程来终止正确的 java 进程。
        • 是的,在 Windows 10 中测试。如果是真的,应用程序名称及其徽标将在任务管理器中。但问题是,如果我按自定义名称终止应用程序,它不会终止应用程序。
        • 哦,对不起,我需要再更正一次。您可以通过杀死整个进程树来终止该进程。它有效。
        • WinRun4J 支持自定义应用程序进程名称。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-02-01
        • 1970-01-01
        • 1970-01-01
        • 2019-02-27
        • 2012-01-14
        • 2011-07-23
        • 2010-09-19
        相关资源
        最近更新 更多