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

时间:2009-05-19 13:40:02

标签: java process argv

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

10 个答案:

答案 0 :(得分:39)

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

在unix上,如果你从shell sript(至少对于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。

答案 1 :(得分:18)

签出launch4j,它是一个可执行的包装器,允许您分配可执行文件名。

答案 2 :(得分:11)

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

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

答案 3 :(得分:5)

如果您正在使用Sun JDK,您还可以使用“jps”命令行工具获取框中运行的Java进程的详细列表。

答案 4 :(得分:4)

这是Windows特有的。
我遇到了同样的问题,我必须使用 taskkill 来杀死特定的java程序。当我运行java程序时, 任务列表 显示相同的程序,其中图像名称设置为 java.exe 。但是使用 taskkill / F java.exe 将其删除将停止除了预期的所有其他java应用程序之外的其他java应用程序。

所以我运行相同的java程序:          

启动“MyProgramName”java java-program ..

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

现在来这个java程序使用以下taskkill命令:          

taskkill / fi“MyProgramName”

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

答案 5 :(得分:3)

假设你真正想要的是一种终止正确的正确过程的方法,那么另一种解决方案就是:

运行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将终止正确的过程。

答案 6 :(得分:2)

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

答案 7 :(得分:2)

您可以使用LD_PRELOAD垫片:https://github.com/airlift/procname

执行此操作

当进程开始时,垫片只调用特定于Linux的prctl()

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

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

答案 8 :(得分:1)

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

答案 9 :(得分:0)

WinRun4J

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