如果一个Java程序被启动,它将在系统进程监视器中显示名称为 java。很多Java程序很难区分。因此,如果有一种方法可以设置在进程监视器中显示的名称,那就太好了。我知道在不同的操作系统上可能会有不同的方式。
一个简单的方法是,如果Java解释器支持一个开关来设置名称,就像这样:
java -processname MyProgram -jar MyProgram
但我找不到这样的开关,所以它可能不存在。用Java编写一个API来设置进程名称也可以。
那么,你有什么建议吗?
我不知道这是否可行,但您可以使用随JDK一起提供的命令行工具“jps”。它类似于*nix中的ps
,但仅显示Java程序。 jps -v
会显示您传递给Java的所有参数。
此外,我看到有人通过将未使用的-Dmyprocessname
添加到args中来附加一个“进程名称”到他们的Java进程中。
就像@omerkudat所说的:
jps -v
打印出所有Java进程的{进程ID,参数列表}。 如果参数列表不足以识别您需要的应用程序, 尝试在运行它们时添加一些虚拟参数:
java -Dname=myApp -cp myApp.jar some.client.main.MainFrame
这将会打印出类似于:7780 MainFrame -Dname=myApp
你可以使用进程ID来终止/监视它。
jps -l
,因为它显示了应用程序的完整包名称。 - smac89LD_PRELOAD
shim来实现这一点: https://github.com/airlift/procname
当进程启动时,该shim仅调用Linux特定的prctl()
: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
这是因为Java应用程序实际上并不是可执行的,它们是由Java虚拟机运行的,这就是为什么Java出现在进程监视器中,它是您应用程序的主机。
然而像LimeWire这样的东西确实可以,但我认为这更多是由于GCJ - http://gcc.gnu.org/java/