如何更改/分配Java .jar进程名称

8
我正在Linux下运行Minecraft,这涉及到运行一个可执行的.jar文件。这意味着它在ps下显示为"java",而不是"minecraft"。我想将其分配为进程名称"minecraft"。
寻找方法时,我发现了通过bash分配进程名称的以下提示: 如何更改Java应用程序进程的名称?
exec -a goodname java ...

我通常使用以下工具运行:

java -cp ~/Games/Minecraft/Minecraft.jar net.minecraft.LauncherFrame

所以尝试制作一个bash脚本:

#!/bin/bash
exec -a minecraft java -cp ~/Games/Minecraft/Minecraft.jar net.minecraft.LauncherFrame

但是当我运行这个命令时,它在ps命令下仍然显示为"java"。

我做错了什么?


在Ubuntu 8.04上,exec -a 对我有效,但它仍然显示所有的Java参数("-cp"等),而且killall无法通过新名称找到该进程,只有killall java才有效。您还可以使用binfmt直接从命令行运行JAR文件。 - Sergei Tachenov
binfmt 允许更改进程名称吗?如果可以,那么在这种情况下我该如何使用它? - emacsomancer
哦,我的错,使用binfmt仍然显示为Java。此外,“exec -a”也无法为其工作。因此,这实际上不是解决方案,而是恰好相反的情况。 - Sergei Tachenov
在CentOS 7下,exec -a命令无法正常工作。 - Kirby Zhou
1个回答

2

这对我有效。我还没有用Java测试过,但我已经使用sleep进行了测试:

victor@vz:~$ exec -a minecraft sleep 1m &
[1] 3858
victor@vz:~$ ps x | grep mine
 3858 pts/2    S      0:00 minecraft 1m
 3860 pts/2    S+     0:00 grep --color=auto mine
victor@vz:~$ 

然而,根据文档显示,这似乎只是一种表面上的变化,并没有实质性的改变:

victor@vz:~$ help exec exec: exec [-cl] [-a name] [command [arguments ...]] [redirection ...] Replace the shell with the given command.

Execute COMMAND, replacing this shell with the specified program.
ARGUMENTS become the arguments to COMMAND.  If COMMAND is not specified,
any redirections take effect in the current shell.

Options:
  -a name pass NAME as the zeroth argument to COMMAND

关于OP在这个回答中的评论:我也在一个远程机器上进行了测试,使用了Java:

victorz@exa:~$ javac test.java # spits out an Administrator.class file among others
victorz@exa:~$ exec -a minecraft java Administrator &
[1] 13142
victorz@exa:~$ ps x | grep mine
13142 pts/1    Sl     0:00 minecraft Administrator
13161 pts/1    S+     0:00 grep --color=auto mine
victorz@exa:~$ 

也许你没有使用x开关来运行ps命令?如果不使用x开关,就无法匹配到任何结果。

我用sleep试过了,就像你说的一样有效。但是似乎在Minecraft/Java中不起作用,我不确定原因。【编辑:我只想进行外观上的更改,所以希望它显示为“Minecraft”与PS。】 - emacsomancer
@B. Slade,也许你的“java”是一种包装器shell脚本,它启动了java二进制文件?因此,它会得到新的进程名称,但然后启动java并因此获得另一个新名称(“java”)。就像binfmt发生的那样。尝试直接运行java二进制文件,例如/wherever/your/jvm/is/bin/java。 - Sergei Tachenov
@Victor:是的,如果我使用-x开关,它会像你说的那样工作。问题是我想让conky能够看到它,但似乎没有办法将该开关传递给conky的top命令。 - emacsomancer
@Sergey Tachenov:看起来我的“java”可能确实是某种包装的shell脚本。然而,当我尝试直接运行程序时,我会收到错误提示,从“java.lang.NoClassDefFoundError”开始。 - emacsomancer
1
@B. Slade,我刚刚检查了一下,没有x选项确实不起作用。我以为x选项只是用于禁用终端过滤。我相信仍然应该有一种方法来做到这一点,可能涉及到/proc文件系统的某些操作。 - Sergei Tachenov
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接