Как программа Java может получить свой собственный идентификатор процесса?
Как мне получить идентификатор моего Java-процесса?
Я 9X_openjdk знаю, что есть несколько хаков, зависящих 9X_processid от платформы, но я бы предпочел более универсальное 9X_java-se решение.
- Это должно быть исправлено в JDK9. http://openjdk.java.net/jeps/10 ...
Ответ #1
Ответ на вопрос: Как программа Java может получить свой собственный идентификатор процесса?
Не существует независимого от платформы 9X_core-java способа, который мог бы гарантированно работать 9X_jdk во всех реализациях jvm.
ManagementFactory.getRuntimeMXBean().getName()
выглядит как лучшее 9X_pid (ближайшее) решение и обычно включает PID. Он 9X_openjdk короткий и возможно работает во всех широко используемых 9X_.java реализациях.
В linux+windows возвращает значение 9X_jdk вроде 12345@hostname
(12345
— идентификатор процесса). Остерегайтесь, однако, что 9X_jdk according to the docs, нет никаких гарантий относительно этого 9X_.java значения:
Возвращает имя работающей виртуальной 9X_j2se машины Java. возвращаемая строка имени может 9X_core-java быть любой произвольной строкой и виртуальным машинная 9X_jre реализация может выбрать встраивание полезных 9X_java-api для конкретной платформы информация в возвращаемой 9X_java-api строке имени. Каждая работающая виртуальная 9X_j2se машина может иметь другое имя.
В Java 9 можно использовать 9X_java-se новый process API:
long pid = ProcessHandle.current().pid();
- Это решение действительно хрупкое. См. Ответ о Hyperic Sigar ниже.<p><spa ...
Ответ #2
Ответ на вопрос: Как программа Java может получить свой собственный идентификатор процесса?
Вы можете использовать JNA. К сожалению, пока 9X_oraclejdk нет общего JNA API для получения идентификатора 9X_processid текущего процесса, но каждая платформа довольно 9X_javax проста:
Windows
Убедитесь, что у вас есть jna-platform.jar
, затем:
int pid = Kernel32.INSTANCE.GetCurrentProcessId();
Unix
Объявить:
private interface CLibrary extends Library {
CLibrary INSTANCE = (CLibrary) Native.loadLibrary("c", CLibrary.class);
int getpid ();
}
Затем:
int pid = CLibrary.INSTANCE.getpid();
Java 9
В 9X_j2se Java 9 новый process API можно использовать для получения 9X_j2se идентификатора текущего процесса. Сначала 9X_javax вы захватываете дескриптор текущего процесса, затем 9X_jdk запрашиваете PID:
long pid = ProcessHandle.current().pid();
- Решение `getpid()` также работает для OS X с вызовом JNA библиотеки " ...
Ответ #3
Ответ на вопрос: Как программа Java может получить свой собственный идентификатор процесса?
Вот метод бэкдора, который может работать не 9X_core-java со всеми виртуальными машинами, но должен 9X_java-libraries работать как в Linux, так и в Windows (original example here):
java.lang.management.RuntimeMXBean runtime =
java.lang.management.ManagementFactory.getRuntimeMXBean();
java.lang.reflect.Field jvm = runtime.getClass().getDeclaredField("jvm");
jvm.setAccessible(true);
sun.management.VMManagement mgmt =
(sun.management.VMManagement) jvm.get(runtime);
java.lang.reflect.Method pid_method =
mgmt.getClass().getDeclaredMethod("getProcessId");
pid_method.setAccessible(true);
int pid = (Integer) pid_method.invoke(mgmt);
- очень хорошо, только что проверил, что он работает как на JRockit, так и на ...
Ответ #4
Ответ на вопрос: Как программа Java может получить свой собственный идентификатор процесса?
Попробуйте Sigar. очень обширные API. Лицензия 9X_javax Apache 2
private Sigar sigar;
public synchronized Sigar getSigar() {
if (sigar == null) {
sigar = new Sigar();
}
return sigar;
}
public synchronized void forceRelease() {
if (sigar != null) {
sigar.close();
sigar = null;
}
}
public long getPid() {
return getSigar().getPid();
}
- У вас было бы намного больше гол ...
Ответ #5
Ответ на вопрос: Как программа Java может получить свой собственный идентификатор процесса?
Следующий метод пытается извлечь PID из 9X_processid java.lang.management.ManagementFactory
:
private static String getProcessId(final String fallback) {
// Note: may fail in some JVM implementations
// therefore fallback has to be provided
// something like '@', at least in SUN / Oracle JVMs
final String jvmName = ManagementFactory.getRuntimeMXBean().getName();
final int index = jvmName.indexOf('@');
if (index < 1) {
// part before '@' empty (index = 0) / '@' not found (index = -1)
return fallback;
}
try {
return Long.toString(Long.parseLong(jvmName.substring(0, index)));
} catch (NumberFormatException e) {
// ignore
}
return fallback;
}
Просто вызовите, например, getProcessId("
.
- VisualVM использует аналогичный код для получения собственного PID, проверьте com.sun.tools.visualvm.application.jvm.Jvm # ApplicationSupport # createCurrentApplication(). Они являются экспертами, так ч ...
Ответ #6
Ответ на вопрос: Как программа Java может получить свой собственный идентификатор процесса?
Для более старых JVM в Linux ...
private static String getPid() throws IOException {
byte[] bo = new byte[256];
InputStream is = new FileInputStream("/proc/self/stat");
is.read(bo);
for (int i = 0; i < bo.length; i++) {
if ((bo[i] < '0') || (bo[i] > '9')) {
return new String(bo, 0, i);
}
}
return "-1";
}
9X_java-api
- Для любопытных, уловка в комментарии @David действительно работает. Кто-нибудь может сказать почему? Какая-то магия в методе `g ...
Ответ #7
Ответ на вопрос: Как программа Java может получить свой собственный идентификатор процесса?
Начиная с Java 9 существует метод Process.getPid(), который 9X_openjdk возвращает собственный идентификатор процесса:
public abstract class Process {
...
public long getPid();
}
Чтобы 9X_j2se получить идентификатор текущего процесса 9X_java-se Java, можно использовать интерфейс ProcessHandle
:
System.out.println(ProcessHandle.current().pid());
- Не могли бы вы объяснить, как получить экземпляр процесса для текущего за ...
Ответ #8
Ответ на вопрос: Как программа Java может получить свой собственный идентификатор процесса?
Вы можете проверить мой проект: JavaSysMon на GitHub. Он 9X_pid предоставляет идентификатор процесса и множество 9X_j2se других вещей (использование ЦП, использование 9X_java-se памяти) кроссплатформенных (в настоящее 9X_pid время Windows, Mac OSX, Linux и Solaris)
Ответ #9
Ответ на вопрос: Как программа Java может получить свой собственный идентификатор процесса?
java.lang.management.ManagementFactory.getRuntimeMXBean().getName().split("@")[0]
9X_processid
Ответ #10
Ответ на вопрос: Как программа Java может получить свой собственный идентификатор процесса?
В Scala:
import sys.process._
val pid: Long = Seq("sh", "-c", "echo $PPID").!!.trim.toLong
Это должно дать вам обходной путь 9X_java в системах Unix до тех пор, пока не будет 9X_oraclejdk выпущена Java 9. (Я знаю, что вопрос касался 9X_java-se Java, но, поскольку для Scala нет эквивалентного 9X_jre вопроса, я хотел оставить его для пользователей 9X_openjdk Scala, которые могут столкнуться с тем же 9X_oraclejdk вопросом.)
Ответ #11
Ответ на вопрос: Как программа Java может получить свой собственный идентификатор процесса?
Для полноты картины в Spring Boot есть оболочка для
String jvmName = ManagementFactory.getRuntimeMXBean().getName();
return jvmName.split("@")[0];
решение. Если 9X_j2se требуется целое число, его можно суммировать 9X_oraclejdk до однострочного:
int pid = Integer.parseInt(ManagementFactory.getRuntimeMXBean().getName().split("@")[0]);
Если кто-то уже использует 9X_.java Spring boot, он / она может использовать 9X_openjdk org.springframework.boot.ApplicationPid
ApplicationPid pid = new ApplicationPid();
pid.toString();
Метод toString() печатает pid или '???'.
Предостережения 9X_oraclejdk при использовании ManagementFactory уже 9X_processid обсуждаются в других ответах.
Ответ #12
Ответ на вопрос: Как программа Java может получить свой собственный идентификатор процесса?
public static long getPID() { String processName = java.lang.management.ManagementFactory.getRuntimeMXBean().getName(); if (processName != null && processName.length() > 0) { try { return Long.parseLong(processName.split("@")[0]); } catch (Exception e) { return 0; } } return 0; }
9X_java-libraries
Ответ #13
Ответ на вопрос: Как программа Java может получить свой собственный идентификатор процесса?
Я добавляю это в дополнение к другим решениям.
с Java 10, чтобы получить process id
final RuntimeMXBean runtime = ManagementFactory.getRuntimeMXBean();
final long pid = runtime.getPid();
out.println("Process ID is '" + pid);
9X_java-libraries
Ответ #14
Ответ на вопрос: Как программа Java может получить свой собственный идентификатор процесса?
Последнее, что я обнаружил, это то, что 9X_core-java существует системное свойство под названием sun.java.launcher.pid
, которое доступно, по 9X_java-se крайней мере, в Linux. Я планирую использовать 9X_java-libraries это, а если не будет найдено, использовать 9X_pid JMX bean
.
Ответ #15
Ответ на вопрос: Как программа Java может получить свой собственный идентификатор процесса?
Это зависит от того, откуда вы ищете информацию.
Если 9X_java-api вы ищете информацию из консоли, вы можете 9X_oraclejdk использовать команду jps. Команда выдает 9X_java результат, аналогичный команде Unix ps, и 9X_openjdk поставляется с JDK, поскольку я считаю, что 9X_java 1.5
Если вы смотрите на процесс, RuntimeMXBean 9X_jre (как сказал Wouter Coekaerts), вероятно, ваш 9X_.java лучший выбор. Вывод из getName() в Windows 9X_java с использованием Sun JDK 1.6 u7 имеет вид 9X_java-api [PROCESS_ID]@[MACHINE_NAME]. Однако вы можете 9X_processid попытаться выполнить jps и проанализировать 9X_j2se результат:
String jps = [JDK HOME] + "\\bin\\jps.exe";
Process p = Runtime.getRuntime().exec(jps);
Если запустить без параметров, результатом 9X_pid должен быть идентификатор процесса, за которым 9X_jre следует имя.
- Инструмент JPS использует библиотеку jvmstat, входящую в состав tools.jar. Посмотрите мой при ...
Ответ #16
Ответ на вопрос: Как программа Java может получить свой собственный идентификатор процесса?
Это код JConsole, который потенциально использует 9X_jre jps и VisualVM. Он использует классы из
Пакет 9X_oraclejdk sun.jvmstat.monitor.*
из tool.jar
.
package my.code.a003.process;
import sun.jvmstat.monitor.HostIdentifier;
import sun.jvmstat.monitor.MonitorException;
import sun.jvmstat.monitor.MonitoredHost;
import sun.jvmstat.monitor.MonitoredVm;
import sun.jvmstat.monitor.MonitoredVmUtil;
import sun.jvmstat.monitor.VmIdentifier;
public class GetOwnPid {
public static void main(String[] args) {
new GetOwnPid().run();
}
public void run() {
System.out.println(getPid(this.getClass()));
}
public Integer getPid(Class> mainClass) {
MonitoredHost monitoredHost;
Set activeVmPids;
try {
monitoredHost = MonitoredHost.getMonitoredHost(new HostIdentifier((String) null));
activeVmPids = monitoredHost.activeVms();
MonitoredVm mvm = null;
for (Integer vmPid : activeVmPids) {
try {
mvm = monitoredHost.getMonitoredVm(new VmIdentifier(vmPid.toString()));
String mvmMainClass = MonitoredVmUtil.mainClass(mvm, true);
if (mainClass.getName().equals(mvmMainClass)) {
return vmPid;
}
} finally {
if (mvm != null) {
mvm.detach();
}
}
}
} catch (java.net.URISyntaxException e) {
throw new InternalError(e.getMessage());
} catch (MonitorException e) {
throw new InternalError(e.getMessage());
}
return null;
}
}
Есть несколько уловок:
-
tool.jar
- это библиотека, распространяемая с Oracle JDK, но не с JRE! - Вы не можете получить
tool.jar
из репозитория Maven; настроить его с помощью Maven немного сложно -
tool.jar
, вероятно, содержит платформенно-зависимый (собственный?) код, поэтому его нелегко распространяемый - Предполагается, что все (локальные) запущенные приложения JVM "отслеживаются". Это выглядит как что из Java 6 все приложения обычно (если вы не настроили противоположное)
- Вероятно, это работает только для Java 6+.
- Eclipse не публикует основной класс, поэтому вы не сможете легко получить Eclipse PID Ошибка в MonitoredVmUtil?
ОБНОВЛЕНИЕ: я 9X_java-se только что дважды проверил, что JPS использует 9X_processid этот способ, то есть библиотеку Jvmstat 9X_javax (часть tool.jar). Таким образом, нет необходимости 9X_openjdk вызывать JPS как внешний процесс, вызывайте 9X_jdk библиотеку Jvmstat напрямую, как показывает 9X_java мой пример. Таким образом вы также можете 9X_javax получить список всех JVM, запущенных на 9X_java-api локальном хосте. См. JPS source code:
Ответ #17
Ответ на вопрос: Как программа Java может получить свой собственный идентификатор процесса?
На основе answer Ашвина Джаяпракаша (+1)
о лицензированном 9X_java-api Apache 2.0 SIGAR
, вот как я использую его для 9X_java получения только PID текущего процесса:
import org.hyperic.sigar.Sigar;
Sigar sigar = new Sigar();
long pid = sigar.getPid();
sigar.close();
Хотя 9X_java он работает не на всех платформах, он работает 9X_pid на Linux, Windows, OS X and various Unix platforms as listed here.
Ответ #18
Ответ на вопрос: Как программа Java может получить свой собственный идентификатор процесса?
Я знаю, что это старый поток, но я хотел 9X_java-se вызвать этот API для получения PID (а также 9X_pid других манипуляций с процессом Java во время 9X_java-api выполнения), добавляемого к классу Process 9X_java-libraries в JDK 9: http://openjdk.java.net/jeps/102
- Вау, это было быстро. На это ушло всего около семи лет! 😃<p><s ...
Ответ #19
Ответ на вопрос: Как программа Java может получить свой собственный идентификатор процесса?
Вы можете попробовать getpid()
в JNR-Posix.
Он имеет оболочку 9X_pid POSIX для Windows, которая вызывает getpid() из 9X_java-api libc.
-
9
-
2
-
4
-
4
-
2
-
1
-
1
-
3
-
7
-
10
-
4
-
8
-
3
-
29
-
7
-
3
-
13
-
9
-
7
-
7
-
9
-
3
-
3
-
4
-
7
-
4
-
4
-
5
-
4
-
4
-
5
-
2
-
3
-
8
-
2
-
3
-
4
-
5
-
2
-
8
-
5
-
3
-
2
-
22
-
7
-
4
-
3
-
3
-
2
-
1