如何更改Java应用程序进程的名称?

how to change the name of a Java application process?

执行Java应用程序时,为其指定的进程名称通常为java.exejavaw.exe。 但是,如何通过应用程序名称来调用它呢?


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

在Unix上,如果从shell sript(至少对于bash可能还有其他类似的shell)启动,则可以使用:

1
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一起使用。


签出launch4j,它是一个可执行包装程序,可用于分配可执行文件名称。


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

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

  • Launch4j,看起来是最新的和最新的
  • JSmooth
  • install4J,商用,超出您的需要


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

所以我使用以下命令运行相同的Java程序:

启动" MyProgramName" java Java程序。

在这里,启动命令将打开一个新窗口,并以窗口标题设置为MyProgramName的方式运行Java程序。
现在使用以下taskkill命令杀死这个Java程序:

taskkill / fi" MyProgramName"

您的Java程序只会被杀死。休息不会受到影响。


如果您使用的是Sun JDK,则还可以使用" jps"命令行工具来获取在包装盒上运行的Java进程的详细列表。


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

运行ps -ef | grep java,您应该得到一个看起来像这样的清单:

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

然后pkill -f peralex.MyApp将终止正确的过程。


您可以使用LD_PRELOAD填充程序执行此操作:https://github.com/airlift/procname

进程启动时,填充程序仅调用特定于Linux的prctl()

1
2
3
4
static void __attribute__ ((constructor)) procname_init()
{
   prctl(PR_SET_NAME,"myname");
}

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


并非所有类型的exec都支持-a标志。如果不是,则argv0程序执行类似的操作。