Comment puis-je trouver mon PID en Java ou JRuby sur Linux?

j'ai besoin de trouver le PID du processus courant sur une plate-forme Linux (il peut s'agir d'une solution dépendante du système). Java ne supporte pas l'obtention de l'identifiant du processus, et JRuby a actuellement un bug avec la méthode Ruby, Process.pid.

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

13
demandé sur Mike Stone 2008-09-26 11:07:11

6 réponses

si vous avez procfs installé, vous pouvez trouver l'identifiant du processus via le lien symbolique /proc/self, qui pointe vers un répertoire dont le nom est le pid (il y a aussi des fichiers ici 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

spécial merci au canal # stackoverflow sur Free node pour m'avoir aidé à résoudre ce problème! (plus précisément, Jerub , gregh , et Topdeck )

25
répondu Mike Stone 2017-05-23 11:53:17

testé uniquement sous Linux avec Sun JVM. Pourrait ne pas fonctionner avec D'autres implémentations JMX.

String pid = ManagementFactory.getRuntimeMXBean().getName().split("@")[0];
7
répondu jassuncao 2008-09-26 08:43:35

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

compiler avec

$ javac POSIX.java

après cela, 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 pour la fonction avec wraps la fonction getpid. Maintenant, vous devez mettre en œuvre 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 ();
}

maintenant vous pouvez le compiler en utilisant 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 où votre Java est installé. 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 lancez-le:

$ java getpid &
[1] 21983
$ 21983

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

2
répondu ceving 2012-07-09 14:19:29

fraie un processus shell qui lit le pid de son parent. Ça doit être notre pid. Voici le code d'exécution, sans exception et la gestion 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 L'on veut obtenir le PID uniquement pour émettre une autre commande shell. Il suffit d'envelopper la commande dans des guillemets pour la passer comme argument à une autre commande, par exemple:

nice `ps h -o ppid $$`

cela peut remplacer la dernière chaîne dans le tableau donnée à l'appel exec .

2
répondu Jarekczek 2012-10-17 05:35:41

vous pouvez essayer getpid() dans JNR-Posix .

il a aussi un wrapper Windows POSIX qui appelle getpid() off de libc. Pas de JNI nécessaire.

0
répondu kervin 2015-03-11 17:02:30

Java 9 offre enfin une manière officielle de le faire avec ProcessHandle :

ProcessHandle.current().pid();

:

  • obtient D'abord une référence ProcessHandle pour le processus actuel.

  • pour accéder à son pid .

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

0
répondu Xavier Guihot 2018-09-26 22:17:41