как изменить имя процесса приложения Java? - PullRequest
38 голосов
/ 19 мая 2009

При выполнении Java-приложения ему обычно присваивается имя процесса java.exe или javaw.exe. Но как я могу сделать так, чтобы он назывался по имени моего приложения?

Ответы [ 8 ]

39 голосов
/ 19 мая 2009

Эти методы подходят для серверов, на которых запущено много java-процессов, и где вам нужен быстрый способ найти правильный jvm (без использования jps). Для приложений я полагаю, что пошёл запуск launch4j или другой оболочки.

В Unix. Если вы запускаете из сценария оболочки (по крайней мере, для bash и, возможно, для других приличных оболочек), вы можете использовать:

exec -a goodname java ...

для запуска java и передачи «goodname» в качестве 0-го аргумента, который будет показан как имя процесса в ps и т. Д.

Возможно, лучшая альтернатива (которая также работает для top) - создать символическую ссылку: ln -s /usr/bin/java /usr/local/bin/kallekula.

Ярлыки в окнах не помогут, но Windows Vista / 7 поддерживает символические ссылки, используя mklink. Это может сработать, но я не проверял. Я не уверен, что exec -a также работает с Cygwin Bash на Windows.

17 голосов
/ 19 мая 2009

Извлечение launch4j , это исполняемая оболочка, которая позволяет назначать исполняемые имена.

10 голосов
/ 19 мая 2009

Если вы не запускаете Java через JNI в своем собственном исполняемом файле, имя процесса всегда будет java.exe.

Существует несколько программ запуска / упаковки Java, которые могут сгенерировать этот исполняемый файл для вас.

  • Launch4j , выглядит самым последним и актуальным
  • JSmooth
  • install4J , коммерческий, больше, чем нужно
5 голосов
/ 19 мая 2009

Если вы используете Sun JDK, вы также можете использовать инструмент командной строки "jps", чтобы получить подробный список процессов Java, запущенных на коробке.

4 голосов
/ 05 декабря 2013

Это специфично для Windows.
Я столкнулся с той же проблемой, где я должен был убить определенную Java-программу, используя taskkill . Когда я запускал программу java, список задач показывал ту же программу с именем изображения, установленным как java.exe . Но его уничтожение с помощью taskkill / F java.exe остановит все другие Java-приложения, кроме предназначенных, что не требуется.

Итак, я запускаю ту же Java-программу, используя:

запуск Java-программы «MyProgramName».

Здесь start команда откроет новое окно и запустит Java-программу с заголовком окна, установленным в MyProgramName .

Теперь, чтобы убить эту java-программу, используйте следующую команду taskkill:

taskkill / fi "MyProgramName"

Ваша Java-программа будет уничтожена только. Отдых не повлияет.

3 голосов
/ 05 июня 2009

Предполагая, что то, что вы действительно ищете, - это способ завершить правильный корректный процесс позже, тогда альтернативное решение таково:

Запустите ps -ef | grep java, и вы получите список, который выглядит примерно так:

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

Тогда pkill -f peralex.MyApp завершит правильный процесс.

2 голосов
/ 21 февраля 2016

Вы можете сделать это с помощью LD_PRELOAD прокладки: https://github.com/airlift/procname

Шим просто вызывает специфичный для Linux prctl() при запуске процесса:

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

Вызов должен произойти в главном потоке, поэтому это невозможно сделать из Java или даже с агентом JVMTI, поскольку они происходят в другом потоке.

2 голосов
/ 17 декабря 2009

Не все разновидности exec поддерживают флаг -a. Если у вас нет, программа argv0 делает нечто подобное.

...