Frage

Ich brauche die PID des laufenden Prozesses auf einer Linux-Plattform zu finden (es kann eine systemabhängige Lösung sein). Java unterstützt die Prozess-ID bekommen, und JRuby hat derzeit einen Fehler mit der Ruby-Methode, Process.pid.

Gibt es einen anderen Weg, um die PID zu erhalten?

War es hilfreich?

Lösung

Wenn Sie procfs installiert haben, können Sie die Prozess-ID über das / proc finden / Selbst Symlink, die in einem Verzeichnis, dessen Name Punkte ist die pid (es werden auch Dateien hier mit anderen relevanten Informationen, einschließlich der PID, aber das Verzeichnis ist alles, was Sie in diesem Fall benötigen).

So mit Java, die Sie tun können:

String pid = new File("/proc/self").getCanonicalFile().getName();

In JRuby, können Sie die gleiche Lösung verwenden:

pid = java.io.File.new("/proc/self").canonical_file.name

Besonderer Dank gebührt den #stackoverflow Kanal auf freien Knoten für hilft mir dieses Problem lösen! (Genauer gesagt, Jerub , Gregh und Topdeck )

Andere Tipps

Nur in Linux mit Sun JVM getestet. Könnte nicht mit anderen JMX-Implementierungen arbeiten.

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

Sie können die JNI-Schnittstelle verwenden, um die POSIX-Funktion aufrufen getpid (). Es ist ziemlich geradlinig. Sie beginnen mit einer Klasse für die POSIX-Funktionen, die Sie benötigen. Ich nenne es POSIX.java:

import java.util.*;

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

Übersetzen mit

$ javac POSIX.java

Danach erzeugen Sie eine Header-Datei POSIX.h mit

$ javah -jni POSIX

Die Header-Datei enthält den C-Prototyp für die Funktion mit Wraps der getpid Funktion. Nun müssen Sie die Funktion implementieren, die recht einfach ist. Ich habe es in POSIX.c:

#include "POSIX.h"

#include <sys/types.h>
#include <unistd.h>

JNIEXPORT jint JNICALL Java_POSIX_getpid (JNIEnv *env, jclass cls)
{
    return getpid ();
}

Jetzt können Sie kompilieren gcc mit:

$ 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

Sie müssen den Speicherort angeben, wo Java installiert ist. Das ist alles. Jetzt können Sie es verwenden. Erstellen Sie ein einfaches getpid Programm:

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

Kompilieren es mit javac getpid.java und führen Sie es:

$ java getpid &
[1] 21983
$ 21983

Der erste pid wird von der Shell geschrieben und das zweite durch das Java-Programm geschrieben wird, nachdem Shell Prompt zurückgekehrt ist. ∎

Spawn ein Shell-Prozess, der seine Eltern pid lesen. Das muss unser pid sein. Hier ist der Lauf Code, ohne Ausnahme und Fehlerbehandlung.

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

Diese Lösung scheint der Beste zu sein, wenn die PID ist nur dann erhalten werden, eine andere Shell-Befehl zu erteilen. Es ist genug, um den Befehl in Hochkommata wickeln Sie es als Argument für einen anderen Befehl übergeben, zum Beispiel:

nice `ps h -o ppid $$`

Dies kann die letzte Zeichenfolge in dem zu exec Aufruf gegeben Array substitue.

Sie können versuchen, getpid () in JNR-Posix .

Es hat auch einen Windows-POSIX-Wrapper, () aus der libc getpid nennt. Keine JNI erforderlich.

Java 9 endlich einen offiziellen Weg bietet eine href zu tun mit <= "https://docs.oracle.com/javase/9/docs/api/java/lang/ProcessHandle.html" rel = "nofollow noreferrer" > ProcessHandle :

ProcessHandle.current().pid();

Dieses:

  • Zuerst wird eine ProcessHandle Referenz für den aktuellen Prozess.

  • Um die pid zuzugreifen.

Kein Import erforderlich, da ProcessHandle gehört java.lang.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top