我如何设置Java程序的进程名称?

如果启动了一个Java程序,它会在系统进程中监视名称java。 很多Java程序都很难区分。 所以,如果存在方法,设置名称将会很好,该名称将显示在进程监视器中。 我知道这可能在不同的操作系统上有所不同。

一个简单的方法是,如果Java解释器将支持一个开关来设置名称,如下所示:

java -processname MyProgram -jar MyProgram 

但是我找不到这样的开关,所以可能是不存在的。 用Java设置进程名的API也可以。

那么,你有什么build议?

我不知道这是否可行,但是可以使用一个名为“jps”的JDK附带的命令行工具。 这就像* nix ps ,而只是Java程序。 jps -v显示所有传递给java的参数。

另外,我还看到人们通过向参数添加一个未使用的-Dmyprocessname来为他们的java进程附加一个“进程名称”。

正如@omerkudat所说:

 jps -v 

打印出所有的java进程{processID,params list}如果参数列表不足以识别你需要的应用程序,请尝试在运行时添加一些伪参数:

 java -Dname=myApp -cp myApp.jar some.client.main.MainFrame 

这将打印如下:

 7780 MainFrame -Dname=myApp 

您可以使用进程ID来终止/监视它。

你可以用LD_PRELOAD shim来做到这一点: https : //github.com/airlift/procname

当进程启动时,shim简单地调用Linux特定的prctl()

 static void __attribute__ ((constructor)) procname_init() { prctl(PR_SET_NAME, "myname"); } 

调用必须发生在主线程上,所以不可能从Java或甚至是JVMTI代理程序这样做,因为这些发生在不同的线程上。

当我第一次读到这个时,改变进程名称的想法让我觉得不可能。 然而,根据sun论坛上的这个古老的线索,你可以使用围绕JVM可执行文件的C ++包装来实现这一点。

虽然坦率地说,我不知道你真正的问题是什么,因为我猜想有一个更标准的解决scheme,然后试图改变进程名称。

你最好的select就像launch4j http://launch4j.sourceforge.net/

有一个buglogging在这个太阳bugtracker,但它不是高优先级http://bugs.sun.com/view_bug.do?bug_id=6299778

如果你想使用不同的进程名称,你将不得不创build自己的二进制文件来启动Java应用程序,使用类似JSmooth的东西。

看这个问题来讨论创build这样的二进制文件。

这是因为Java应用程序并不是真正可执行的,它们是由Java虚拟机运行的,这就是java出现在进程监视器中的原因,它是应用程序的主机。

像LimeWire然而,但我认为这是更多的GCJ – http://gcc.gnu.org/java/

主要有两种方法:一种是已经描述的:使用像Launch4j,WinRun4J这样的工具来创build本地Windows启动器。

看起来更好的另一种方法是使用Apache Procrun将Java应用程序封装为Windows服务。 在安装服务过程中,我们可以给过程一个有意义的名字,比如OurApp.exe。

我们所需要做的就是将prunsrv.exe重命名为OurApp.exe,并将安装|开始|停止|卸载服务脚本中的每个prunsrv.exereplace为MyApp.exe。

请参阅使用Apache Procrun在Windows中重命名Java程序的进程名称