如何更改Java应用程序进程的名称?
执行Java应用程序时,给它的进程名称通常是java.exe
或javaw.exe
。 但是我怎样才能让我的应用程序的名称叫它?
这些方法适用于运行大量java进程的服务器,以及需要快速find正确jvm(不使用jps)的服务器。对于应用程序,我认为launch4j或其他包装器是最好的select。
在unix上,如果你从一个shell sript启动(至less对于bash和其他像样的shell),你可以使用:
exec -a goodname java ...
启动java
并将“goodname”作为第0个parameter passing,这将在ps
显示为进程名称。
一个可能更好的替代方法(似乎也适用于top
)是创build一个符号链接: ln -s /usr/bin/java /usr/local/bin/kallekula
。
Windows中的快捷方式不会诀窍,但Windows Vista / 7支持使用mklink
符号链接。 这可能工作,但我没有testing。 我不确定exec -a
也适用于Windows上的cygwin bash。
检查出launch4j ,它是一个可执行的包装,允许您分配可执行文件的名称。
除非您在自己的自定义可执行文件中通过JNI启动Java,否则进程名称将始终为java.exe。
有几个Java启动程序/包装可以为您生成这个可执行文件。
- Launch4j ,看起来是最新的和最新的
- JSmooth
- 安装4J ,商业,超过你的需要
如果您使用的是Sun JDK,则还可以使用“jps”命令行工具来获取运行在框中的Java进程的详细列表。
假设你真的以后是一种终止正确的过程的方法,那么另一种解决scheme是:
运行ps -ef | grep java
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
将杀死正确的进程。
这是特定于Windows的。
我面临着同样的问题,我必须杀死使用taskkill特定的Java程序。 当我运行java程序时, tasklist显示的图像名称设置为java.exe 。 但使用taskkill / F java.exe杀死它将停止除了预期不需要的以外的所有其他Java应用程序。
所以我运行相同的Java程序使用:
启动“MyProgramName”java java-program ..
这里start命令会打开一个新窗口,并运行窗口标题设置为MyProgramName的java程序。
现在用这个java程序使用下面的taskkill命令:
taskkill / fi“MyProgramName”
你的Java程序只会被杀死。 rest将不受影响。
并不是所有的exec都支持-a标志。 如果你的没有,那么argv0程序也会做类似的事情。
你可以用LD_PRELOAD
shim来做到这一点: https : //github.com/airlift/procname
当进程启动时,shim简单地调用Linux特定的prctl()
static void __attribute__ ((constructor)) procname_init() { prctl(PR_SET_NAME, "myname"); }
调用必须发生在主线程上,所以不可能从Java或甚至是JVMTI代理程序这样做,因为这些发生在不同的线程上。
我已经通过使用Janel解决了同样的问题。 它提供了一个非常简单的方法来创build.jar本地可执行文件(exe)的Windows,作为新的服务开始。 使用以下过程在Windows中将Java应用程序创build为可执行文件:
- 从janel下载并解压缩文件。
- 然后将两个文件JanelWindows.exe,JanelWindows.lap复制到您的.jar所在的文件夹中。
- 现在将文件JanelWindows.exe和JanelWindows.lap重命名为jarname.exe和jarname.lap
-
现在在文本编辑器中打开jarname.lap并设置属性:
-Djava.class.path = .jar文件的path,janel.main.class = ipSetting.Start
现在你可以打开yourjar.exe作为新的进程。 希望这将有助于somone …