执行 Java 应用程序时,赋予它的进程名称通常是java.exe
或javaw.exe
。但是我怎样才能让它被我的应用程序的名称调用呢?
10 回答
这些方法适用于运行大量 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。
查看launch4j,它是一个可执行包装器,允许您分配可执行名称。
这是特定于 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 程序只会被杀死。休息不受影响。
如果您使用的是 Sun JDK,您还可以使用“jps”命令行工具来获取机器上运行的 Java 进程的详细列表。
您可以使用LD_PRELOAD
shim 执行此操作:https ://github.com/airlift/procname
shim 只是prctl()
在进程启动时调用特定于 Linux 的:
static void __attribute__ ((constructor)) procname_init()
{
prctl(PR_SET_NAME, "myname");
}
调用必须发生在主线程上,因此不可能从 Java 甚至使用 JVMTI 代理执行此操作,因为这些发生在不同的线程上。
假设您真正追求的是一种稍后终止正确过程的方法,那么另一种解决方案是:
运行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
将杀死正确的进程。
并非所有的 exec 风格都支持 -a 标志。如果你没有,argv0程序会做类似的事情。
我需要在 Windows 中解决此问题,以使我能够停止特定的 java 进程。我已经决定使用 .bat 文件来运行不同的 .jar 文件,.bat 文件的第一行是 TITLE “Name to give the cmd window”,然后当我查看不同的 cmd 窗口时,我可以看到哪个是我想要停止的那个,然后通过那个 cmd 窗口按 Ctrl-C。