Pregunta

Necesito encontrar el PID del proceso actual en ejecución en una plataforma Linux (puede ser una solución dependiente del sistema). Java no admite la obtención del ID de proceso, y JRuby actualmente tiene un error con el método Ruby, Process.pid.

¿Hay otra manera de obtener el PID?

¿Fue útil?

Solución

Si tiene procfs instalado, puede encontrar la identificación del proceso a través de / proc / enlace simbólico propio, 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 lo que necesita 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 #stackoverflow en el nodo libre por ayudarme a resolver esto! (específicamente, Jerub , gregh , y Topdeck )

Otros consejos

Solo probado en Linux usando Sun JVM. Podría no funcionar con otras implementaciones JMX.

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

Puede usar la interfaz JNI para llamar a la función POSIX getpid (). Es bastante sencillo. Comienzas con una clase para las funciones POSIX que necesitas. Lo llamo POSIX.java :

import java.util.*;

class POSIX
{
    static { System.loadLibrary ("POSIX"); }
    native static int getpid ();
}

Compílalo con

$ javac POSIX.java

Después de eso, genera un archivo de encabezado POSIX.h con

$ javah -jni POSIX

El archivo de encabezado contiene el prototipo C para la función con envuelve 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á instalado su Java. Eso es todo. Ahora puedes usarlo. Crea un programa simple de getpid:

public class getpid
{
    public static void main (String argv[])
    {
        System.out.println (POSIX.getpid ());
    }
}

Compílalo con javac getpid.java y ejecútalo:

$ java getpid &
[1] 21983
$ 21983

El primer pid es escrito por el shell y el segundo es escrito por el programa Java una vez que el indicador del shell ha regresado & # 8718;

Genera un proceso de shell que leerá el pid de su padre. Ese debe ser nuestro pid. Aquí está el código en 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 el PID se debe obtener solo para emitir otro comando de shell. Es suficiente envolver el comando entre comillas anteriores para pasarlo como un 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.

Java 9 finalmente ofrece una forma oficial de hacerlo con ProcessHandle :

ProcessHandle.current().pid();

Esto:

  • Primero obtiene una referencia ProcessHandle para el proceso actual.

  • Para acceder a su pid.

No es necesario importar ya que ProcessHandle es parte de java.lang .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top