2009-06-29 188 views
49

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

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

java -processname MyProgram -jar MyProgram 

但我无法找到这样一个开关,所以它可能是不existant。用Java设置进程名称的API也可以。

那么,你有什么建议吗?

回答

40

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

而且,我看到人们通过添加一个未使用的-Dmyprocessname到ARGS附加一个“进程名”到他们的Java进程。

+0

不完全的答案,我问,但究竟我的问题的正确答案。谢谢。 :-) – Mnementh 2009-06-29 10:20:34

+0

由于缺乏setproctitle,这是一个聪明的解决方案。荣誉。 – synthesizerpatel 2012-01-26 05:27:16

+1

我也在寻找类似的选项。但是这个答案对我来说并不清楚。有人可以向我解释如何设置进程名称。我看到有一个选项叫'-D =值'。我们需要使用这个选项吗?谢谢。 – Naresh 2012-07-17 08:10:28

1

这是因为Java应用程序实际上不是可执行它们是由Java虚拟机,这是为什么Java的出现在过程监控,这是你的应用程序的主机运行。

事情是这样的LimeWire但是这样做,但我认为这是越往下GCJ - 如果你想使用一个不同的进程名,你就必须创建自己的二进制文件使用的东西来启动你的Java应用程序一样JSmoothhttp://gcc.gnu.org/java/

5

当我第一次读这,改变进程名的想法让我觉得是不可能的。但是,根据this ancient thread on the sun forum,您可以使用围绕JVM可执行文件的C++包装来实现此目的。

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

16

jps -v 

打印出所有java进程{processID,params list} 如果参数列表不足以识别您需要的应​​用程序, 试运行时,他们增加了一些假PARAMS:

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

这将打印,如:

7780 MainFrame -Dname=myApp 

,你可以使用进程ID杀/监控。

10

您可以用LD_PRELOAD垫片做到这一点:https://github.com/airlift/procname

垫片只需调用Linux特有prctl()的当过程开始时:

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

呼叫已在主线程中发生的话,从Java或甚至使用JVMTI代理都无法做到这一点,因为这些发生在不同的线程上。

1

主要有两种方法:一种是已经描述过的:使用Launch4j,WinRun4J等工具来创建本机Windows启动器。

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

所有我们需要做的是重新命名prunsrv.exe到OurApp.exe和替换在我们安装prunsrv.exe每次|开始|停止|卸载服务脚本MyApp.exe的。

查看更多从Using Apache Procrun to Rename Process Name of a Java Program in Windows

相关问题