执行Java应用程序时,为其指定的进程名称通常为java.exe
或javaw.exe
。但是如何通过我的应用程序名称来调用它呢?
答案 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)