添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

如何改变一个Java应用进程的名称?

43 人关注

当执行一个Java应用程序时,给它的进程名称通常是 java.exe javaw.exe 。但我怎样才能使它被我的应用程序的名称所调用呢?

java
process
argv
Ravindra
Ravindra
发布于 2009-05-19
10 个回答
KarlP
KarlP
发布于 2020-02-21
已采纳
0 人赞同

这些方法适用于有大量java进程运行的服务器,以及需要快速找到正确的jvm的地方(不使用jps)。 对于应用程序,我想launch4j或其他包装器才是正确的方法。

在unix系统中,如果你从一个shell脚本中启动(至少对于bash,可能对于其他像样的shell),你可以使用。

exec -a goodname java ...

来启动java,并传递 "goodname "作为第0个参数,它将被显示为ps的进程名称,等等。

一个可能更好的选择(似乎也适用于top)是创建一个符号链接。ln -s /usr/bin/java /usr/local/bin/kallekula

在windows中的快捷键不会起到作用,但windows vista/7支持使用mklink的符号链接。这可能有效,但我没有测试过。我不确定exec -a是否也适用于Windows上的cygwin bash。

这对启动服务器等很有好处,因为它是在启动shell-script中的一个简单编辑。
不,当我读到这个问题时,我完全处于unix思维。我已经编辑了答案。
我以为它在Ubuntu 11.04上也不起作用。事实证明,它设置了一些名字,但不是 "根 "的名字。替换代码0】显示的是指定的名称,而 htop 被告知 "默认显示自定义线程名称 , but both show java`"时也是如此。
哦。'top'似乎显示可执行文件的名称(磁盘上的文件名)。ps'显示命令行的arg[0]。我想top以前也显示这个,但也许是为了提高安全性而被改变了。我想不可能改变到exe的链接。不过,用另一行做一个软链接总是可能的。我已经再次更新了答案。
@KarlP 在构建独立exe文件时,如何在netbeans javafx项目中改变它?
z  -
z -
发布于 2020-02-21
0 人赞同

Check out launch4j ,它是一个可执行的包装器,允许你指定可执行的名称。

该功能已在2013年被删除。 3.1.0-beta2版的变化 (20-08-2013) 删除了与较新的Windows版本不兼容的自定义进程名称功能。
launch4j确实不再允许你改变javaw.exe进程的名称。 但是,如果你使用选项stayalive=true来创建launch4j exe,那么除了javaw.exe进程外,你自定义的exe文件的进程名称将保留在进程列表中。 所以,这给了用户一个选择,即通过杀死带有你的自定义名称的进程来杀死正确的java进程。
是的,在Windows 10中测试过。当它是真实的,应用程序的名称和它的标志将出现在任务管理器中。但问题是,如果我用它的自定义名称杀死该应用程序,它不会杀死该应用程序。
哦,对不起,我需要再次纠正。你可以通过杀死整个进程树来杀死这个进程。这很有效。
WinRun4J 支持自定义的应用进程名称。
basszero
basszero
发布于 2020-02-21
0 人赞同

除非你通过JNI在你自己定制的可执行文件中启动Java,否则进程名称将总是java.exe。

有几个java启动器/包装器可以为你生成这个可执行文件。

  • Launch4j , looks to be the most recent and up to date
  • JSmooth
  • install4J , commercial, more than you need
  • SamB
    ......即使你要重命名为 java.exe ?
    elite21
    elite21
    发布于 2020-02-21
    0 人赞同

    This is specific to Windows.
    我也面临着同样的问题,我必须用以下方法杀死特定的java程序 口袋杀戮 .当我运行java程序时。 任务列表 显示的是同一个程序,图像名称设置为 java.exe . But killing it using 口袋杀戮 /F java.exe 将停止所有其他的java应用程序,而不是预定的那个不需要的应用程序。

    因此,我运行相同的java程序,使用。

    开始 "我的程序名称" java java-program...

    Here 开始 命令将打开一个新窗口并运行java程序,窗口的标题设置为 我的程序名称 .

    Now to kil this java-program use the following 口袋杀戮 command:

    口袋杀戮 /fi "我的程序名称"

    你的Java程序将只被杀死。其他的将不受影响。

    谢谢你,这正是我所寻找的。只有一点小意见。替换代码0】对我不起作用。我不得不添加过滤条件。 taskkill /fi "WINDOWTITLE eq MyProgramName"
    Rob H
    Rob H
    发布于 2020-02-21
    0 人赞同

    如果你使用的是Sun JDK,你也可以使用 "jps "命令行工具来获得盒子上运行的Java进程的详细列表。

    David Phillips
    David Phillips
    发布于 2020-02-21
    0 人赞同

    你可以用一个 LD_PRELOAD 的垫片来做这个。 https://github.com/airlift/procname

    当进程开始时,shim简单地调用Linux特有的 prctl()

    static void __attribute__ ((constructor)) procname_init()
       prctl(PR_SET_NAME, "myname");
    

    调用必须发生在主线程上,所以不可能从Java或甚至用JVMTI代理来做这个,因为这些都发生在不同的线程上。

    Good solution! But Linux only.
    Noel Grandin
    Noel Grandin
    发布于 2020-02-21
    0 人赞同

    假设你真正追求的是一种在以后终止正确进程的方法,那么另一种解决方案就是这样。

    运行 ps -ef | grep java ,你应该得到一个列表,看起来像这样。

     mruser    7518  7505  4 11:37 pts/3    00:00:00 /usr/bin/java -classpath MRD3030_Linked.jar peralex.MyApp
    

    Then pkill -f peralex.MyApp will kill the correct process.

    请注意,只有在/remembered/命令行没有被系统截断的情况下才有效。Linux和Solaris都对被记住的命令行的长度有限制(与接受的最大长度无关),如果你有一个长的classpath,就很容易超过这个长度。
    mpm
    mpm
    发布于 2020-02-21
    0 人赞同

    并非所有版本的exec都支持-a标志。如果你的系统不支持,那么 argv0 程序做了类似的事情。

    替换代码0】确实是默认安装的, argv0 只是用准备好的参数字符串调用 execve(2) ,其手册中包含了一个C代码的例子。
    Benjamin James
    Benjamin James
    发布于 2020-02-21
    0 人赞同