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

How can I set the process name for a Java-program?

本问题已经有最佳答案,请猛点这里访问。

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

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

1
java -processname MyProgram -jar MyProgram

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

那么,您有什么建议吗?


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

此外,我还看到人们通过将未使用的-Dmyprocessname添加到args为其Java进程附加"进程名称"。


@omerkudat所说:

1
jps -v

打印出所有Java进程{processID,params list}
如果参数列表不足以识别您所需的应用程序,
尝试在运行它们时添加一些虚拟参数:

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

打印结果如下:

1
7780 MainFrame -Dname=myApp

,您可以使用进程ID杀死/监视它。


您可以使用LD_PRELOAD垫片进行此操作:https://github.com/airlift/procname

进程启动时,填充程序仅调用特定于Linux的prctl()

1
2
3
4
static void __attribute__ ((constructor)) procname_init()
{
   prctl(PR_SET_NAME,"myname");
}

该调用必须在主线程上进行,因此不可能从Java甚至是JVMTI代理执行此操作,因为这些调用发生在不同的线程上。


您最好的选择是launch4j
http://launch4j.sourceforge.net/

为此,在sun bugtracker中记录了一个错误,但这不是很高的优先级
http://bugs.sun.com/view_bug.do?bug_id=6299778


当我第一次阅读本文时,更改进程名称的想法使我感到震惊。但是,根据sun论坛上的这一古老话题,您可以在JVM可执行文件周围使用C包装器来实现此目的。

坦率地说,我想知道您的真正问题是什么,因为我猜想有一个更标准的解决方案,然后尝试更改进程名称。


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

似乎更好的另一种方法是使用Apache Procrun将Java应用程序包装为Windows服务。在安装服务过程中,我们可以为过程指定一个有意义的名称,例如OurApp.exe。

我们需要做的就是将prunsrv.exe重命名为OurApp.exe,并将在install | start | stop | uninstall服务脚本中每次出现的prunsrv.exe替换为MyApp.exe。

在Windows中使用Apache Procrun重命名Java程序的进程名称中查看更多内容


如果要使用其他进程名称,则必须创建自己的二进制文件才能使用JSmooth之类的程序启动Java应用程序。

请参阅此问题以讨论如何创建此类二进制文件。


这是因为Java应用程序实际上不是可执行文件,而是由Java虚拟机运行的,这就是Java出现在进程监视器中的原因,它是应用程序的宿主。

不过,像LimeWire这样的事情确实存在,但我认为这更多地取决于GCJ-http://gcc.gnu.org/java/