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
此外,我还看到人们通过将未使用的
@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杀死/监视它。
您可以使用
进程启动时,填充程序仅调用特定于Linux的
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/