¿Cómo encuentro mi PID en Java o JRuby en Linux?
(5)
Solo probado en Linux utilizando Sun JVM. Puede que no funcione con otras implementaciones JMX.
String pid = ManagementFactory.getRuntimeMXBean().getName().split("@")[0];
Necesito encontrar el PID del proceso en ejecución actual en una plataforma Linux (puede ser una solución dependiente del sistema). Java no admite obtener el ID del proceso, y JRuby actualmente tiene un error con el método de Ruby, Process.pid.
¿Hay alguna otra manera de obtener el PID?
Puede usar la interfaz JNI para llamar a la función POSIX getpid (). Es bastante directo. Comienza con una clase para las funciones POSIX que necesita. Lo llamo POSIX.java
:
import java.util.*;
class POSIX
{
static { System.loadLibrary ("POSIX"); }
native static int getpid ();
}
Compilarlo con
$ javac POSIX.java
Después de eso POSIX.h
un archivo de cabecera POSIX.h
con
$ javah -jni POSIX
El archivo de encabezado contiene el prototipo C para la función con la función getpid. Ahora tienes que implementar la función, que es bastante fácil. Lo hice en POSIX.c
:
#include "POSIX.h"
#include <sys/types.h>
#include <unistd.h>
JNIEXPORT jint JNICALL Java_POSIX_getpid (JNIEnv *env, jclass cls)
{
return getpid ();
}
Ahora puedes compilarlo usando gcc:
$ gcc -Wall -I/usr/lib/jvm/java-1.6.0-sun-1.6.0.21/include -I/usr/lib/jvm/java-1.6.0-sun-1.6.0.21/include/linux -o libPOSIX.so -shared -Wl,-soname,libPOSIX.so POSIX.c -static -lc
Debe especificar la ubicación donde está instalada su Java. Eso es todo. Ahora puedes usarlo. Crea un programa getpid simple:
public class getpid
{
public static void main (String argv[])
{
System.out.println (POSIX.getpid ());
}
}
Compilarlo con javac getpid.java
y ejecutarlo:
$ java getpid &
[1] 21983
$ 21983
El primer pid está escrito por el shell y el segundo escrito por el programa Java después de que el prompt del shell ha regresado. ∎
Genera un proceso de shell que leerá el pid de su padre. Ese debe ser nuestro pid. Aquí está el código de ejecución, sin excepción y manejo de errores.
import java.io.*;
import java.util.Scanner;
public class Pid2
{
public static void main(String sArgs[])
throws java.io.IOException, InterruptedException
{
Process p = Runtime.getRuntime().exec(
new String[] { "sh", "-c", "ps h -o ppid $$" });
p.waitFor();
Scanner sc = new Scanner(p.getInputStream());
System.out.println("My pid: " + sc.nextInt());
Thread.sleep(5000);
}
}
Esta solución parece ser la mejor si se debe obtener el PID solo para emitir otro comando de shell. Es suficiente para envolver el comando en comillas posteriores para pasarlo como argumento a otro comando, por ejemplo:
nice `ps h -o ppid $$`
Esto puede sustituir la última cadena en la matriz dada a la llamada exec
.
Puedes probar getpid () en JNR-Posix .
También tiene un contenedor POSIX de Windows que llama a getpid () fuera de libc. No se necesita JNI.
Si tiene procfs instalados, puede encontrar la identificación del proceso a través del / proc / self symlink, que apunta a un directorio cuyo nombre es el pid (también hay archivos aquí con otra información pertinente, incluido el PID, pero el directorio es todo necesitas en este caso).
Por lo tanto, con Java, puedes hacer:
String pid = new File("/proc/self").getCanonicalFile().getName();
En JRuby, puedes usar la misma solución:
pid = java.io.File.new("/proc/self").canonical_file.name
¡Gracias especiales al canal # en el nodo libre por ayudarme a resolver esto! (específicamente, Jerub , gregh y Topdeck )