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

时间:2009-06-29 08:47:58

标签: java process

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

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

java -processname MyProgram -jar MyProgram

但我找不到这样的开关,所以它可能不存在。 Java中用于设置进程名称的API也没问题。

那么,你有什么建议吗?

8 个答案:

答案 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/