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

Mne*_*nth 59 java process

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

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

java -processname MyProgram -jar MyProgram
Run Code Online (Sandbox Code Playgroud)

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

那么,你有什么建议吗?

ome*_*dat 47

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

此外,我看到人们通过向-Dmyprocessnameargs 添加一个未使用的程序,将"进程名称"附加到他们的java进程中.

  • -D想法的+1不会比那更快或更简单 (3认同)

d.r*_*aev 20

正如@omerkudat所说:

jps -v
Run Code Online (Sandbox Code Playgroud)

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

java -Dname=myApp -cp  myApp.jar some.client.main.MainFrame
Run Code Online (Sandbox Code Playgroud)

这将打印如下:

7780 MainFrame -Dname=myApp
Run Code Online (Sandbox Code Playgroud)

并且您可以使用进程ID来终止/监视它.

  • 我更喜欢“jps -l”,因为它显示了应用程序的完整包名称 (2认同)

Dav*_*ips 11

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

prctl()当进程启动时,垫片只调用特定于Linux的:

static void __attribute__ ((constructor)) procname_init()
{
   prctl(PR_SET_NAME, "myname");
}
Run Code Online (Sandbox Code Playgroud)

调用必须在主线程上进行,因此无法从Java或甚至使用JVMTI代理执行此操作,因为这些操作发生在不同的线程上.

  • 这段代码是如此微不足道(它只调用一个函数),它甚至看起来都不受版权保护.请将其视为公共领域.如果需要,我可以添加LICENSE文件. (5认同)

Tim*_*der 5

当我第一次读到这篇文章时,更改进程名称的想法让我觉得不可能.但是,根据sun论坛上的这个古老的线程,你可以使用围绕JVM可执行文件的C++包装器来实现这一点.

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

  • 如果你不得不杀死你的应用程序并运行几个Java应用程序,那将会有点受伤. (3认同)
  • 您说得对,omerkudat 提到的 jps-command 无需重命名进程即可解决问题。 (2认同)
  • 创建一个小的本机JNI包装器来启动应用程序也很容易.对于我们这些进行Windows部署的人来说,它允许自动配置JVM,自定义图标等......这真的不难做到. (2认同)
  • @pdem 看到这个问题:/sf/ask/2323066301/要点是使用launch4j。我很抱歉做出只是一个链接的答案。我还年轻,不知道更好。 (2认同)

Noe*_*din 5

你最好的选择是类似于 launch4j http://launch4j.sourceforge.net/

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