Question

Je dois trouver le PID du processus en cours d'exécution sur une plate-forme Linux (il peut s'agir d'une solution dépendant du système). Java ne prend pas en charge l’obtention de l’ID de processus et JRuby a actuellement un bogue avec la méthode Ruby, Process.pid.

Existe-t-il un autre moyen d'obtenir le PID?

Était-ce utile?

La solution

Si vous avez procfs , vous pouvez trouver l'ID de processus via / proc /. lien symbolique automatique, qui pointe vers un répertoire dont le nom est le pid (il existe également des fichiers avec d’autres informations pertinentes, y compris le PID, mais le répertoire est tout ce dont vous avez besoin dans ce cas).

Ainsi, avec Java, vous pouvez faire:

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

Dans JRuby, vous pouvez utiliser la même solution:

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

Merci au canal #stackoverflow sur le noeud libre pour m'aider à résoudre ce problème! (spécifiquement, Jerub , gregh et Topdeck )

Autres conseils

Testé uniquement sous Linux avec Sun JVM. Peut ne pas fonctionner avec d'autres implémentations JMX.

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

Vous pouvez utiliser l'interface JNI pour appeler la fonction POSIX getpid (). C'est assez simple. Vous commencez avec une classe pour les fonctions POSIX dont vous avez besoin. Je l'appelle POSIX.java :

import java.util.*;

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

Compilez-le avec

$ javac POSIX.java

Ensuite, vous générez un fichier d'en-tête POSIX.h avec

.
$ javah -jni POSIX

Le fichier d'en-tête contient le prototype C de la fonction avec la fonction getpid encapsulée. Maintenant, vous devez implémenter la fonction, ce qui est assez facile. Je l'ai fait dans POSIX.c :

#include "POSIX.h"

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

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

Vous pouvez maintenant le compiler avec 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

Vous devez spécifier l'emplacement d'installation de votre Java. C'est tout. Maintenant, vous pouvez l'utiliser. Créez un programme getpid simple:

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

Compilez-le avec javac getpid.java et exécutez-le:

$ java getpid &
[1] 21983
$ 21983

Le premier pid est écrit par le shell et le second par le programme Java après le retour de l'invite du shell. ?

Créez un processus shell qui lira le pid de son parent. Ce doit être notre pid. Voici le code en cours d'exécution, sans exception ni traitement des erreurs.

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

Cette solution semble être la meilleure si le PID doit être obtenu uniquement pour émettre une autre commande shell. Il suffit d'envelopper la commande entre guillemets pour le passer comme argument à une autre commande, par exemple:

nice `ps h -o ppid $`

Ceci peut remplacer la dernière chaîne du tableau attribué à l'appel exec .

Vous pouvez essayer d'obtenir getpid () dans JNR-Posix .

Il possède également un wrapper Windows POSIX qui appelle getpid () depuis libc. Aucune JNI nécessaire.

Java 9 offre enfin un moyen officiel de le faire avec ProcessHandle :

ProcessHandle.current().pid();

Ceci:

  • Obtient d'abord une référence ProcessHandle pour le processus en cours.

  • Pour accéder à son pid .

Aucune importation nécessaire car ProcessHandle fait partie de java.lang .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top