43

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

4

10 回答 10

42

这些方法适用于运行大量 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。

于 2009-05-19T15:01:24.577 回答
18

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

于 2009-05-19T13:42:30.383 回答
11

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

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

于 2009-05-19T13:43:33.563 回答
9

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

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

启动“MyProgramName”java java-program..

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

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

taskkill /fi "我的程序名"

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

于 2013-12-05T12:16:08.013 回答
5

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

于 2009-05-19T14:52:32.363 回答
4

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

shim 只是prctl()在进程启动时调用特定于 Linux 的:

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

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

于 2016-02-21T03:09:20.320 回答
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将杀死正确的进程。

于 2009-06-05T12:03:15.047 回答
2

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

于 2009-12-16T21:52:07.107 回答
1

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

于 2020-04-29T23:49:28.363 回答
0

WinRun4J

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

于 2020-02-21T13:19:07.073 回答