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?
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 )
testé uniquement sous Linux avec Sun JVM. Pourrait 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 ();
}
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.
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
.
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
.