当执行一个Java应用程序时,给它的进程名称通常是
java.exe
或
javaw.exe
。但我怎样才能使它被我的应用程序的名称所调用呢?
如何改变一个Java应用进程的名称?
这些方法适用于有大量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。
KarlP
:
这对启动服务器等很有好处,因为它是在启动shell-script中的一个简单编辑。
KarlP
:
不,当我读到这个问题时,我完全处于unix思维。我已经编辑了答案。
Raphael
:
我以为它在Ubuntu 11.04上也不起作用。事实证明,它设置了一些名字,但不是 "根 "的名字。替换代码0】显示的是指定的名称,而
htop
被告知 "默认显示自定义线程名称
, but both show
java`"时也是如此。
KarlP
:
哦。'top'似乎显示可执行文件的名称(磁盘上的文件名)。ps'显示命令行的arg[0]。我想top以前也显示这个,但也许是为了提高安全性而被改变了。我想不可能改变到exe的链接。不过,用另一行做一个软链接总是可能的。我已经再次更新了答案。
TejpalBh
:
@KarlP 在构建独立exe文件时,如何在netbeans javafx项目中改变它?
z -
发布于
2020-02-21
0
人赞同
Check out
launch4j
,它是一个可执行的包装器,允许你指定可执行的名称。
该功能已在2013年被删除。 3.1.0-beta2版的变化 (20-08-2013) 删除了与较新的Windows版本不兼容的自定义进程名称功能。
Enwired
:
launch4j确实不再允许你改变javaw.exe进程的名称。 但是,如果你使用选项stayalive=true来创建launch4j exe,那么除了javaw.exe进程外,你自定义的exe文件的进程名称将保留在进程列表中。 所以,这给了用户一个选择,即通过杀死带有你的自定义名称的进程来杀死正确的java进程。
是的,在Windows 10中测试过。当它是真实的,应用程序的名称和它的标志将出现在任务管理器中。但问题是,如果我用它的自定义名称杀死该应用程序,它不会杀死该应用程序。
哦,对不起,我需要再次纠正。你可以通过杀死整个进程树来杀死这个进程。这很有效。
WinRun4J
支持自定义的应用进程名称。
elite21
发布于
2020-02-21
0
人赞同
This is specific to Windows.
我也面临着同样的问题,我必须用以下方法杀死特定的java程序
口袋杀戮
.当我运行java程序时。
任务列表
显示的是同一个程序,图像名称设置为
java.exe
. But killing it using
口袋杀戮 /F java.exe
将停止所有其他的java应用程序,而不是预定的那个不需要的应用程序。
因此,我运行相同的java程序,使用。
开始 "我的程序名称" java java-program...
Here
开始
命令将打开一个新窗口并运行java程序,窗口的标题设置为
我的程序名称
.
Now to kil this java-program use the following 口袋杀戮 command:
口袋杀戮 /fi "我的程序名称"
你的Java程序将只被杀死。其他的将不受影响。
Florian
:
谢谢你,这正是我所寻找的。只有一点小意见。替换代码0】对我不起作用。我不得不添加过滤条件。
taskkill /fi "WINDOWTITLE eq MyProgramName"
。
David Phillips
发布于
2020-02-21
0
人赞同
你可以用一个
LD_PRELOAD
的垫片来做这个。
https://github.com/airlift/procname
当进程开始时,shim简单地调用Linux特有的
prctl()
。
static void __attribute__ ((constructor)) procname_init()
prctl(PR_SET_NAME, "myname");
调用必须发生在主线程上,所以不可能从Java或甚至用JVMTI代理来做这个,因为这些都发生在不同的线程上。
Good solution! But Linux only.
Noel Grandin
发布于
2020-02-21
0
人赞同
假设你真正追求的是一种在以后终止正确进程的方法,那么另一种解决方案就是这样。
运行
ps -ef | grep java
,你应该得到一个列表,看起来像这样。
mruser 7518 7505 4 11:37 pts/3 00:00:00 /usr/bin/java -classpath MRD3030_Linked.jar peralex.MyApp
Then pkill -f peralex.MyApp
will kill the correct process.
ankon
:
请注意,只有在/remembered/命令行没有被系统截断的情况下才有效。Linux和Solaris都对被记住的命令行的长度有限制(与接受的最大长度无关),如果你有一个长的classpath,就很容易超过这个长度。