que gui java pid

java - gui - jtextfield



¿Cómo puede un programa Java obtener su propio ID de proceso? (22)

Añadiendo a otras soluciones.

con Java 10, para obtener la process id

final RuntimeMXBean runtime = ManagementFactory.getRuntimeMXBean(); final long pid = runtime.getPid(); out.println("Process ID is ''" + pid);

¿Cómo obtengo el id de mi proceso Java?

Sé que hay varios hacks que dependen de la plataforma, pero preferiría una solución más genérica.


Aquí está mi solución:

public static boolean isPIDInUse(int pid) { try { String s = null; int java_pid; RuntimeMXBean rt = ManagementFactory.getRuntimeMXBean(); java_pid = Integer.parseInt(rt.getName().substring(0, rt.getName().indexOf("@"))); if (java_pid == pid) { System.out.println("In Use/n"); return true; } } catch (Exception e) { System.out.println("Exception: " + e.getMessage()); } return false; }


Aquí hay un método de puerta trasera que podría no funcionar con todas las máquinas virtuales, pero debería funcionar tanto en Linux como en Windows ( ejemplo original aquí ):

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);


Depende de donde estés buscando la información.

Si está buscando la información de la consola, puede usar el comando jps. El comando da una salida similar al comando ps de Unix y viene con el JDK ya que creo que 1.5

Si está buscando en el proceso, RuntimeMXBean (como dijo Wouter Coekaerts) es probablemente su mejor opción. La salida de getName () en Windows con Sun JDK 1.6 u7 tiene el formato [PROCESS_ID] @ [MACHINE_NAME]. Sin embargo, puedes intentar ejecutar jps y analizar el resultado de eso:

String jps = [JDK HOME] + "//bin//jps.exe"; Process p = Runtime.getRuntime().exec(jps);

Si se ejecuta sin opciones, la salida debe ser el ID de proceso seguido del nombre.


Desde Java 9 hay un método Process.getPid () que devuelve el ID nativo de un proceso:

public abstract class Process { ... public long getPid(); }

Para obtener el ID de proceso del proceso Java actual, se puede usar la interfaz ProcessHandle :

System.out.println(ProcessHandle.current().pid());


El siguiente método intenta extraer el PID de 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 ''<pid>@<hostname>'', 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; }

Simplemente llame a getProcessId("<PID>") , por ejemplo.


En Scala:

import sys.process._ val pid: Long = Seq("sh", "-c", "echo $PPID").!!.trim.toLong

Esto debería darle una solución alternativa en los sistemas Unix hasta que se lance Java 9. (Lo sé, la pregunta era sobre Java, pero como no hay una pregunta equivalente para Scala, quería dejar esto para los usuarios de Scala que podrían tropezar con la misma pregunta).


En base a la answer Ashwin Jayaprakash (+1) sobre el SIGAR licencia de Apache 2.0, aquí se explica cómo lo uso para obtener solo el PID del proceso actual:

import org.hyperic.sigar.Sigar; Sigar sigar = new Sigar(); long pid = sigar.getPid(); sigar.close();

Aunque no funciona en todas las plataformas, sí funciona en Linux, Windows, OS X y varias plataformas Unix como se indica aquí .


Encontré una solución que puede ser un poco un caso de vanguardia y no la probé en otro sistema operativo que no sea Windows 10, pero creo que vale la pena darse cuenta.

Si te encuentras trabajando con J2V8 y nodejs, puedes ejecutar una función javascript simple que te devuelve el pid del proceso java.

Aquí hay un ejemplo:

public static void main(String[] args) { NodeJS nodeJS = NodeJS.createNodeJS(); int pid = nodeJS.getRuntime().executeIntegerScript("process.pid;/n"); System.out.println(pid); nodeJS.release(); }


Este es el código JConsole, y potencialmente utiliza jps y VisualVM. Utiliza clases del paquete sun.jvmstat.monitor.* , De 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<Integer> 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; } }

Hay pocas capturas:

  • El tool.jar es una biblioteca distribuida con Oracle JDK pero no JRE!
  • No puede obtener tool.jar del repositorio de Maven; configurarlo con Maven es un poco complicado
  • El tool.jar probablemente contiene código dependiente de la plataforma (¿nativo?) Por lo que no es fácilmente distribuible
  • Se ejecuta bajo el supuesto de que todas las aplicaciones JVM (locales) que se ejecutan son "monitorizables". Parece que desde Java 6 todas las aplicaciones son en general (a menos que se configure de forma activa a la inversa)
  • Probablemente funcione solo para Java 6+
  • Eclipse no publica la clase principal, por lo que no obtendrá Eclipse PID fácilmente ¿Error en MonitoredVmUtil?

ACTUALIZACIÓN: Acabo de verificar que JPS utiliza de esta manera, es decir, la biblioteca Jvmstat (parte de tool.jar). Así que no hay necesidad de llamar a JPS como proceso externo, llame a la biblioteca Jvmstat directamente como muestra mi ejemplo. También puede obtener una lista de todas las JVM que se ejecutan en localhost de esta manera. Ver grepcode.com/file_/repository.grepcode.com/java/root/jdk/… JPS:


Esto es lo que usé cuando tuve un requisito similar. Esto determina el PID del proceso de Java correctamente. Deje que su código Java genere un servidor en un número de puerto predefinido y luego ejecute los comandos del sistema operativo para averiguar la escucha PID en el puerto. Para linux

netstat -tupln | grep portNumber


Lo último que he encontrado es que hay una propiedad del sistema llamada sun.java.launcher.pid que está disponible al menos en Linux. Mi plan es usar eso y si no se encuentra que use el JMX bean .


Para JVM mayores, en 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"; }


Para completar, hay un envoltorio en Spring Boot para el

String jvmName = ManagementFactory.getRuntimeMXBean().getName(); return jvmName.split("@")[0];

solución. Si se requiere un número entero, esto se puede resumir en una sola línea:

int pid = Integer.parseInt(ManagementFactory.getRuntimeMXBean().getName().split("@")[0]);

Si alguien ya usa Spring Boot, él / él podría usar org.springframework.boot.ApplicationPid

ApplicationPid pid = new ApplicationPid(); pid.toString();

El método toString () imprime el pid o ''???''.

Las advertencias sobre el uso de ManagementFactory se tratan en otras respuestas ya.


Podrías usar JNA . Desafortunadamente, todavía no existe una API JNA común para obtener el ID de proceso actual, pero cada plataforma es bastante simple:

Windows

Asegúrate de tener jna-platform.jar entonces:

int pid = Kernel32.INSTANCE.GetCurrentProcessId();

Unix

Declarar:

private interface CLibrary extends Library { CLibrary INSTANCE = (CLibrary) Native.loadLibrary("c", CLibrary.class); int getpid (); }

Entonces:

int pid = CLibrary.INSTANCE.getpid();

Java 9

Bajo Java 9, la nueva API de proceso se puede usar para obtener el ID de proceso actual. Primero, toma un identificador del proceso actual, luego consulta el PID:

long pid = ProcessHandle.current().pid();


Prueba Sigar . APIs muy extensas. Licencia 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(); }


Puedes probar getpid() en github.com/jnr/jnr-posix .

Tiene un contenedor POSIX de Windows que llama a getpid () fuera de libc.


Puedes ver mi proyecto: JavaSysMon en GitHub. Proporciona una identificación de proceso y un montón de otras cosas (uso de CPU, uso de memoria) multiplataforma (actualmente Windows, Mac OSX, Linux y Solaris)


Sé que este es un hilo antiguo, pero quería agregar esa API para obtener el PID (así como otra manipulación del proceso de Java en tiempo de ejecución) se agrega a la clase de proceso en JDK 9: openjdk.java.net/jeps/102


No existe una forma independiente de la plataforma que se pueda garantizar que funcione en todas las implementaciones de jvm. ManagementFactory.getRuntimeMXBean().getName() parece a la mejor solución (la más cercana). Es corto, y probablemente funciona en todas las implementaciones en uso generalizado.

En Linux + Windows, devuelve un valor como 12345@hostname ( 12345 es el id del proceso). Tenga en cuenta que, de acuerdo con los documentos , no hay garantías sobre este valor:

Devuelve el nombre que representa la máquina virtual Java en ejecución. La cadena de nombre devuelta puede ser cualquier cadena arbitraria y una implementación de máquina virtual Java puede optar por incrustar información útil específica de la plataforma en la cadena de nombre devuelta. Cada máquina virtual en ejecución podría tener un nombre diferente.

En Java 9 se puede usar la nueva API de proceso :

long pid = ProcessHandle.current().pid();


java.lang.management.ManagementFactory.getRuntimeMXBean().getName().split("@")[0]


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; }