【发布时间】:2010-10-27 08:07:00
【问题描述】:
在执行 Java 应用程序时,为其指定的进程名称通常是 java.exe 或 javaw.exe。但是我怎样才能让它被我的应用程序的名字调用呢?
【问题讨论】:
在执行 Java 应用程序时,为其指定的进程名称通常是 java.exe 或 javaw.exe。但是我怎样才能让它被我的应用程序的名字调用呢?
【问题讨论】:
我需要在 Windows 中解决此问题,以使我能够停止特定的 Java 进程。我已经决定使用 .bat 文件来运行不同的 .jar 文件,.bat 文件的第一行是 TITLE “Name to give the cmd window”,然后当我查看不同的 cmd 窗口时,我可以看到哪个是我想停止的那个,然后通过那个 cmd 窗口按 Ctrl-C。
【讨论】:
您可以使用LD_PRELOAD shim 执行此操作:https://github.com/airlift/procname
当进程启动时,shim 只调用 Linux 特定的prctl():
static void __attribute__ ((constructor)) procname_init()
{
prctl(PR_SET_NAME, "myname");
}
调用必须发生在主线程上,因此不可能从 Java 甚至使用 JVMTI 代理执行此操作,因为这些调用发生在不同的线程上。
【讨论】:
这是特定于 Windows 的。
我遇到了同样的问题,我必须使用 taskkill 杀死特定的 java 程序。当我运行 java 程序时,tasklist 显示的是图像名称设置为 java.exe 的同一程序。但是使用 taskkill /F java.exe 杀死它会停止所有其他 Java 应用程序,而不是不需要的预期应用程序。
所以我使用以下方式运行相同的 java 程序:
启动“MyProgramName”java java-program..
这里 start 命令将打开一个新窗口并运行 java 程序,窗口的标题设置为 MyProgramName。
现在要杀死这个 java 程序,请使用以下 taskkill 命令:
taskkill /fi "MyProgramName"
您的 Java 程序只会被终止。休息不受影响。
【讨论】:
taskkill /fi "MyProgramName" 对我不起作用。我必须添加过滤条件:taskkill /fi "WINDOWTITLE eq MyProgramName"
假设您真正追求的是一种稍后终止正确进程的方法,那么另一种解决方案是:
运行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会杀掉正确的进程。
【讨论】:
这些方法适用于运行大量 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。
【讨论】:
ps x 显示指定的名称,htop 默认情况下被告知“显示自定义线程名称, but both show java”。
并非所有的 exec 风格都支持 -a 标志。如果你没有,argv0 程序会做类似的事情。
【讨论】:
argv0 默认已安装,argv0 只需使用准备好的参数字符串调用execve(2),其手册包含示例 C 代码。
如果您使用的是 Sun JDK,您还可以使用“jps”命令行工具来获取机器上运行的 Java 进程的详细列表。
【讨论】:
查看launch4j,它是一个可执行包装器,允许您分配可执行名称。
【讨论】: