2009-06-29 187 views
49

如果啓動了Java程序,它會在系統進程中監視名稱java。許多Java程序都很難區分。所以,如果存在一種方法,設置名稱將會很好,該名稱將顯示在進程監視器中。我知道這可能在不同的操作系統上有所不同。如何設置Java程序的進程名稱?

一個簡單的辦法是,如果Java解釋器將支持一個開關來設置的名稱,如:

java -processname MyProgram -jar MyProgram 

但我無法找到這樣一個開關,所以它可能是不existant。用Java設置進程名稱的API也可以。

那麼,你有什麼建議嗎?

回答

40

我不知道這是可能的,但你可以使用附帶了一個名爲「太平紳士」的JDK的命令行工具。這就像* nix ps,但只是Java程序。 jps -v顯示您傳遞給java的所有參數。

而且,我看到人們通過添加一個未使用的-Dmyprocessname到ARGS附加一個「進程名」到他們的Java進程。

+0

不完全的答案,我問,但究竟我的問題的正確答案。謝謝。 :-) – Mnementh 2009-06-29 10:20:34

+0

由於缺乏setproctitle,這是一個聰明的解決方案。榮譽。 – synthesizerpatel 2012-01-26 05:27:16

+1

我也在尋找類似的選項。但是這個答案對我來說並不清楚。有人可以向我解釋如何設置進程名稱。我看到有一個選項叫'-D =值'。我們需要使用這個選項嗎?謝謝。 – Naresh 2012-07-17 08:10:28

1

這是因爲Java應用程序實際上不是可執行它們是由Java虛擬機,這是爲什麼Java的出現在過程監控,這是你的應用程序的主機運行。

事情是這樣的LimeWire但是這樣做,但我認爲這是越往下GCJ - 如果你想使用一個不同的進程名,你就必須創建自己的二進制文件使用的東西來啓動你的Java應用程序一樣JSmoothhttp://gcc.gnu.org/java/

5

當我第一次讀這,改變進程名的想法讓我覺得是不可能的。但是,根據this ancient thread on the sun forum,您可以使用圍繞JVM可執行文件的C++包裝來實現此目的。

雖然坦率地說,我不知道你真正的問題是什麼,我猜有一個更標準的解決方案,然後試圖改變的進程名。

16

jps -v 

打印出所有java進程{processID,params list} 如果參數列表不足以識別您需要的應​​用程序, 試運行時,他們增加了一些假PARAMS:

java -Dname=myApp -cp myApp.jar some.client.main.MainFrame 

這將打印,如:

7780 MainFrame -Dname=myApp 

,你可以使用進程ID殺/監控。

10

您可以用LD_PRELOAD墊片做到這一點:https://github.com/airlift/procname

墊片只需調用Linux特有prctl()的當過程開始時:

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

呼叫已在主線程中發生的話,從Java或甚至使用JVMTI代理都無法做到這一點,因爲這些發生在不同的線程上。

1

主要有兩種方法:一種是已經描述過的:使用Launch4j,WinRun4J等工具來創建本機Windows啓動器。

看起來更好的另一種方法是使用Apache Procrun將Java應用程序封裝爲Windows服務。在安裝服務過程中,我們可以爲流程提供一個有意義的名稱,例如OurApp.exe。

所有我們需要做的是重新命名prunsrv.exe到OurApp.exe和替換在我們安裝prunsrv.exe每次|開始|停止|卸載服務腳本MyApp.exe的。

查看更多從Using Apache Procrun to Rename Process Name of a Java Program in Windows

相關問題