2009-06-29 20 views
49

Jeśli program Java jest uruchomiony, dostaje on w systemie-monitor-proces nazwę java. Wiele programów Java jest w ten sposób trudnych do odróżnienia. Byłoby miło, jeśli istnieje, ustawić nazwę, która pojawi się w monitorze procesu. Jestem świadomy, że może to działać inaczej w różnych systemach operacyjnych.Jak ustawić nazwę procesu dla programu Java?

Prostym sposobem byłoby, gdyby java-interpreter poprą przełącznika aby ustawić nazwę, na przykład:

java -processname MyProgram -jar MyProgram 

Ale nie mogłem znaleźć takiego przełącznika, więc jest to prawdopodobnie nie- istniejący. Interfejs API w Javie, który ustawiłby nazwę procesu, również byłby w porządku.

Więc masz jakieś sugestie?

Odpowiedz

40

Nie wiem, czy jest to możliwe, ale można użyć narzędzia wiersza poleceń, które pochodzi z JDK o nazwie "jps". To jest jak * nix ps, ale zamiast tego tylko programy Java. jps -v pokazuje wszystkie argumenty przekazane do java.

Ponadto widziałem, jak ludzie dołączali "nazwę procesu" do swoich procesów java, dodając do args nieużywane -Dmyprocessname.

+0

Niezupełnie odpowiedź na to spytałem, ale dokładnie to właściwa odpowiedź na mój problem. Dzięki. :-) – Mnementh

+0

Ze względu na brak instrukcji setproctitle jest to sprytne rozwiązanie. Sława. – synthesizerpatel

+1

Poszukuję również podobnych opcji. Ale ta odpowiedź nie jest dla mnie jasna. Czy ktoś może mi wyjaśnić, jak ustawić nazwę procesu? Widziałem opcję o nazwie "-D = wartość". Czy potrzebujemy skorzystać z tej opcji? Dzięki. – Naresh

1

Dzieje się tak dlatego, że aplikacje Java nie są faktycznie uruchamialne, ponieważ są uruchamiane przez wirtualną maszynę Java, dlatego java pojawia się w monitorze procesu, jest hostem aplikacji.

Rzeczy takie jak LimeWire jednak nie, ale myślę, że to bardziej w dół do GCJ - http://gcc.gnu.org/java/

2

Jeśli chcesz użyć innej nazwy procesu musisz utworzyć własny plik binarny, aby uruchomić aplikację Java przy użyciu coś jak JSmooth .

Look at this question do dyskusji na temat tworzenia takich plików binarnych.

5

Kiedy po raz pierwszy przeczytałem ten pomysł, zmiana nazwy procesu uderzyła mnie jako niemożliwą. Jednak zgodnie z this ancient thread on the sun forum można użyć wrapperów C++ wokół pliku wykonywalnego JVM, aby to osiągnąć.

Szczerze mówiąc, zastanawiam się, jaki jest twój prawdziwy problem, ponieważ domyślam się, że istnieje bardziej standardowe rozwiązanie, a następnie próba zmiany nazwy procesu.

+3

Gdybyś musiał zabić swoją aplikację i miał uruchomione kilka aplikacji Java, byłby to mały hit. – Lloyd

+1

Masz rację, polecenie jps wspomniane przez omerkudat rozwiązuje problem bez zmiany nazw procesów. – Mnementh

+2

Tworzenie małego rodzimego opakowania JNI do uruchomienia aplikacji jest również bardzo łatwe. Dla tych z nas, którzy wdrażają system Windows, pozwala to na automatyczną konfigurację JVM, niestandardowych ikon itp. ... To naprawdę nie jest trudne. –

16

jak @omerkudat powiedział:

jps -v 

wyświetla wszystkie procesy java {processID, lista parametrów} Jeśli lista parametrów nie jest wystarczająca do rozpoznania potrzebnych aplikacji, spróbuj dodać jakieś fikcyjne params podczas ich trwania:

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

To będzie drukować jak:

7780 MainFrame -Dname=myApp 

i można użyć identyfikator procesu zabić/monitorować go.

10

Można to zrobić za pomocą LD_PRELOAD podkładki: https://github.com/airlift/procname

Podkładka prostu wywołuje specyficzne dla Linuksa prctl() gdy proces rozpoczyna:

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

Wezwanie musi się zdarzyć w głównym wątku, więc nie można tego zrobić z poziomu Javy ani z agenta JVMTI, ponieważ występują one w innym wątku.

+1

To działa naprawdę dobrze i jest prostszym podejściem niż większość tutaj. –

+0

Rozważałoby użycie tego kodu, jeśli kod byłby licencjonowany w ramach MIT, Apache lub jakiejś innej takiej umowy licencyjnej. –

+4

Ten kod jest tak banalny (wywołuje tylko jedną funkcję), że nawet nie wydaje się być objęty ochroną praw autorskich. Traktuj to jako własność publiczną. Jeśli chcesz, mogę dodać plik LICENCJI. –

1

Istnieją dwa główne podejścia: jeden jest taki, jak opisano: używanie takich narzędzi jak Launch4j, WinRun4J do tworzenia rodzimych programów uruchamiających system Windows.

Innym podejściem, które wydaje się lepsze, jest użycie Apache Procrun do owinięcia aplikacji java jako usługi Windows. Podczas procesu instalacji usługi możemy nadać procesowi znaczącą nazwę, na przykład OurApp.exe.

Wszystko, czego potrzebujemy, to zmienić nazwę pliku prunsrv.exe na plik OurApp.exe i zastąpienie każdego wystąpienia pliku prunsrv.exe w naszych skryptach usługi instalacji | start | stop | uninstall MyApp.exe.

Zobacz więcej od Using Apache Procrun to Rename Process Name of a Java Program in Windows

Powiązane problemy