如果启动了Java程序,它将在系统进程中监视名称java。许多Java程序很难区分。因此,如果存在方式,设置名称将会很好,这将显示在进程监视器中。我知道这可能在不同的操作系统上有所不同。
一种简单的方法是,如果java解释器支持设置名称的开关,如下所示:
java -processname MyProgram -jar MyProgram
但我找不到这样的开关,所以它可能不存在。 Java中用于设置进程名称的API也没问题。
那么,你有什么建议吗?
答案 0 :(得分:46)
我不知道这是否可行,但您可以使用JDK附带的名为'jps'的命令行工具。它就像* nix ps
,而只是Java程序。 jps -v
显示您传递给java的所有参数。
另外,我看到人们通过在args中添加一个未使用的-Dmyprocessname
来为他们的java进程附加一个“进程名称”。
答案 1 :(得分:19)
正如@omerkudat所说:
jps -v
打印出所有java进程{processID,params list} 如果params列表不足以识别您需要的应用程序, 尝试在运行它们时添加一些虚拟参数:
java -Dname=myApp -cp myApp.jar some.client.main.MainFrame
这将打印如下:
7780 MainFrame -Dname=myApp
您可以使用进程ID来终止/监控它。
答案 2 :(得分:11)
您可以使用LD_PRELOAD
垫片:https://github.com/airlift/procname
当进程开始时,垫片只调用特定于Linux的prctl()
:
static void __attribute__ ((constructor)) procname_init()
{
prctl(PR_SET_NAME, "myname");
}
调用必须在主线程上进行,因此无法从Java或甚至使用JVMTI代理执行此操作,因为这些操作发生在不同的线程上。
答案 3 :(得分:5)
当我第一次读到这篇文章时,更改进程名称的想法让我觉得不可能。但是,根据this ancient thread on the sun forum,您可以使用围绕JVM可执行文件的C ++包装器来实现此目的。
虽然坦率地说,我想知道你的真正问题是什么,因为我猜有更标准的解决方案,然后尝试更改流程名称。
答案 4 :(得分:4)
你最好的选择就像launch4j http://launch4j.sourceforge.net/
sun bugtracker中记录了一个错误,但它不是高优先级 http://bugs.sun.com/view_bug.do?bug_id=6299778
答案 5 :(得分:2)
如果要使用其他进程名称,则必须使用JSmooth之类的内容创建自己的二进制文件来启动Java应用程序。
Look at this question有关创建此类二进制文件的讨论。
答案 6 :(得分:2)
主要有两种方法:一种是已经描述的:使用Launch4j,WinRun4J等工具创建本机Windows启动器。
另一种似乎更好的方法是使用Apache Procrun将java应用程序包装为Windows服务。在安装服务过程中,我们可以为进程提供一个有意义的名称,例如OurApp.exe。
我们需要做的就是将prunsrv.exe重命名为OurApp.exe,并将install-stop | uninstall服务脚本中每次出现的prunsrv.exe替换为MyApp.exe。
从Using Apache Procrun to Rename Process Name of a Java Program in Windows
了解详情答案 7 :(得分:1)
那是因为Java应用程序实际上不是可执行的,它们是由Java虚拟机运行的,这就是java出现在进程监视器中的原因,它是应用程序的主机。
然而LimeWire之类的事情确实如此,但我认为这更像是GCJ - http://gcc.gnu.org/java/