Подтвердить что ты не робот

Как установить имя процесса для Java-программы?

Если запускается Java-программа, она входит в системный процесс-мониторинг имени java. Многие Java-программы трудно отличить. Поэтому было бы неплохо, если бы существовал способ, чтобы установить имя, которое будет отображаться в мониторе процесса. Я знаю, что это может работать по-разному в разных операционных системах.

Простым способом было бы, если бы java-интерпретатор поддерживал бы переключатель для установки имени, например:

java -processname MyProgram -jar MyProgram

Но я не мог найти такой переключатель, поэтому он, вероятно, не существует. API в Java, чтобы установить имя процесса, также будет прекрасным.

Итак, у вас есть предложения?

4b9b3361

Ответ 1

Я не знаю, возможно ли это, но вы можете использовать инструмент командной строки, который поставляется с JDK под названием "jps". Это похоже на * nix ps, но вместо этого на Java. jps -v показывает все аргументы, которые вы передали в java.

Кроме того, я видел, как люди присоединяют "имя процесса" к своим java-процессам, добавляя неиспользуемые -Dmyprocessname к args.

Ответ 2

как сказал @omerkudat:

jps -v

выводит все java-процессы {processID, params list} Если список параметров недостаточно для распознавания приложений, которые вам нужны, попробуйте добавить некоторые фиктивные параметры при их запуске:

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

Это будет печатать как:

7780 MainFrame -Dname=myApp

и вы можете использовать идентификатор процесса, чтобы убить/контролировать его.

Ответ 3

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

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

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

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

Ответ 4

Когда я впервые прочитал это, идея изменения названия процесса показалась мне невозможной. Однако, согласно этой древней нити на форуме солнца, вы можете использовать обертки С++ вокруг исполняемого файла JVM для достижения этого.

Хотя, честно говоря, мне интересно, какова ваша настоящая проблема, поскольку я предполагаю, что существует более стандартное решение, а затем попытка изменить имя процесса.

Ответ 6

Если вы хотите использовать другое имя процесса, вам нужно создать свой собственный двоичный файл, чтобы запустить приложение Java, используя что-то вроде JSmooth.

Посмотрите на этот вопрос для обсуждения создания таких двоичных файлов.

Ответ 7

Что, поскольку приложения Java на самом деле не исполняются, они запускаются виртуальной машиной Java, поэтому на мониторе процесса отображается Java, это хост вашего приложения.

Вещи, подобные LimeWire, однако, но я думаю, что больше до GCJ - http://gcc.gnu.org/java/

Ответ 8

В основном есть два подхода: один из них уже описан: с помощью таких инструментов, как Launch4j, WinRun4J для создания собственных пусковых установок Windows.

Другим подходом, который кажется лучше, является использование Apache Procrun для переноса приложения Java как службы Windows. Во время процесса установки службы мы можем предоставить процессу значимое имя, например, OurApp.exe.

Все, что нам нужно сделать, это переименовать prunsrv.exe в наш файл OurApp.exe и заменить каждое возникновение prunsrv.exe в наших сценариях установки | start | stop | uninstall service на MyApp.exe.

Подробнее см. Использование Apache Procrun для переименования имени процесса программы Java в Windows