Как установить имя процесса для Java-программы?
Если Java-программа запущена, она попадает в системный процесс-монитор с именем java. Многие Java-программы так трудно отличить. Поэтому было бы неплохо, если бы существовал способ установить имя, которое будет отображаться в мониторе процесса. Я знаю, что это может работать по-разному в разных операционных системах.
Простой способ был бы, если бы Java-интерпретатор поддерживал переключатель для установки имени, например так:
java -processname MyProgram -jar MyProgram
Но я не смог найти такой переключатель, поэтому он, вероятно, не существует. API в Java для установки имени процесса также подойдет.
Итак, у вас есть предложения?
8 ответов
Я не знаю, возможно ли это, но вы могли бы использовать инструмент командной строки, который поставляется с JDK под названием "jps". Это как * nix ps
, но только программы на Java. jps -v
показывает все аргументы, которые вы передали в Java.
Кроме того, я видел, как люди прикрепляли "имя процесса" к своим процессам Java, добавляя неиспользуемые -Dmyprocessname
в args.
Как @omerkudat сказал:
jps -v
распечатывает все процессы Java {processID, список параметров} Если списка параметров недостаточно для распознавания приложений, которые вам нужны, попробуйте добавить несколько фиктивных параметров при их запуске:
java -Dname=myApp -cp myApp.jar some.client.main.MainFrame
Это будет печатать как:
7780 MainFrame -Dname=myApp
и вы можете использовать идентификатор процесса, чтобы убить / контролировать его.
Вы можете сделать это с LD_PRELOAD
Шим: https://github.com/airlift/procname
Шим просто называет Linux специфичным prctl()
когда процесс начинается:
static void __attribute__ ((constructor)) procname_init()
{
prctl(PR_SET_NAME, "myname");
}
Вызов должен произойти в главном потоке, поэтому это невозможно сделать из Java или даже с агентом JVMTI, поскольку они происходят в другом потоке.
Ваш лучший вариант - что-то вроде launch4j http://launch4j.sourceforge.net/
Для этого в багтрекере Sun есть ошибка, но она не имеет высокого приоритета http://bugs.sun.com/view_bug.do?bug_id=6299778
Когда я впервые прочитал это, идея изменить имя процесса показалась мне невозможной. Однако, согласно этой древней ветке на форуме Sun, вы можете использовать оболочки C++ вокруг исполняемого файла JVM для достижения этой цели.
Хотя, честно говоря, мне интересно, какова ваша настоящая проблема, так как я предполагаю, что есть более стандартное решение, чем попытка изменить имя процесса.
Существует в основном 2 подхода: один из них уже описан: использование таких инструментов, как Launch4j, WinRun4J, для создания собственных средств запуска Windows.
Другой подход, который кажется более подходящим, заключается в использовании Apache Procrun для упаковки Java-приложения в качестве службы Windows. В процессе установки службы мы можем дать процессу осмысленное имя, например OurApp.exe.
Все, что нам нужно сделать, это переименовать prunsrv.exe в OurApp.exe и заменить каждое вхождение prunsrv.exe в наших сценариях установки | запуска | остановки | удаления на MyApp.exe.
Подробнее об использовании Apache Procrun для переименования имени процесса Java-программы в Windows
Если вы хотите использовать другое имя процесса, вам нужно будет создать свой собственный двоичный файл для запуска вашего Java-приложения, используя что-то вроде JSmooth.
Посмотрите на этот вопрос для обсуждения создания таких двоичных файлов.
Это потому, что Java-приложения на самом деле не являются исполняемыми, их запускает виртуальная машина Java, поэтому на мониторе процесса появляется java, которая является хостом вашего приложения.
Такие вещи, как LimeWire, однако делают, но я думаю, что это больше зависит от GCJ - http://gcc.gnu.org/java/