Linux :recuperer les pid de tous les Process qui tounent avec Java

[Résolu]
Signaler
Messages postés
69
Date d'inscription
mercredi 27 janvier 2010
Statut
Membre
Dernière intervention
16 avril 2013
-
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
-
bonjour
j'ai utilisé la class Runtime et la command "top" pour récuperer tous les listes des Pids qui tournent , mais je sais pas pourquoi mon programme me retourne juste le pid du java Process et pas la liste de tous les process , voici mon code :

import java.io.*;


public class Process_Info {




Process_Info()
{
String line = "";
try {
// Execute a command without arguments
// String[] command = {"ps", "-","efwH"};
String[] command = {"ls"};
Process child = Runtime.getRuntime().exec(command);
BufferedReader in = new BufferedReader(new InputStreamReader(child.getInputStream()));

while ((line = in.readLine()) != null) {
System.out.println(line);
System.out.println(line);
}



// Execute a command with an argument
//command = "ls /tmp";
// child = Runtime.getRuntime().exec(command);
} catch (IOException e) {
}


}



}
A voir également:

17 réponses

Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
360
	public static void main(String[] args) {
/* Construction de la chaine (toi tu récupères le flux de sortie de ps */
StringBuilder sb = new StringBuilder();
sb.append("PID TTY TIME CMD").append("\n");
sb.append("7431 pts/0    00:00:00 su").append("\n");
sb.append("7434 pts/0    00:00:00 bash").append("\n");
sb.append("18585 pts/0    00:00:00 ps").append("\n");
String resultatPS = sb.toString();

/* Là, tu récupère chaque ligne dans un tableau */
String[] mots = resultatPS.split("\n");

/* Et tu lances le traitement pour toutes les lignes */
for(int i=1; i<mots.length; i++){
recupererInfos(mots[i]);
}
}

public static void recupererInfos(String ligne){
String[] mots = ligne.split("\\p{Space}+");
System.out.println("PID:"+mots[0]+" "+"nom:"+mots[3]);
}
Messages postés
69
Date d'inscription
mercredi 27 janvier 2010
Statut
Membre
Dernière intervention
16 avril 2013

modification programme :



import java.io.*;


public class Process_Info {




Process_Info()
{
String line = "";
try {
// Execute a command without arguments
// String command = ("top");
String command = ("top");
Process child = Runtime.getRuntime().exec(command);
BufferedReader in = new BufferedReader(new InputStreamReader(child.getInputStream()));

while ((line = in.readLine()) != null) {
System.out.println(line);
System.out.println(line);
}



// Execute a command with an argument
//command = "ls /tmp";
// child = Runtime.getRuntime().exec(command);
} catch (IOException e) {
}


}



}
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
360
Bonjour,

Essayes avec la commande ps -e
Messages postés
69
Date d'inscription
mercredi 27 janvier 2010
Statut
Membre
Dernière intervention
16 avril 2013

merci julien .
maintenant je récupére la list suivante :

j'aimerais utilisais des matcher et pattern pour mettre dans un tableau les PID et un autre les CMD ,mais je m'etrise pas trop cette technique :





PID TTY TIME CMD
1 ? 00:00:00 init
2 ? 00:00:00 kthreadd
3 ? 00:00:00 ksoftirqd/0
5 ? 00:00:00 kworker/u:0
6 ? 00:00:00 migration/0
7 ? 00:00:00 cpuset
8 ? 00:00:00 khelper
9 ? 00:00:00 netns
10 ? 00:00:00 sync_supers
11 ? 00:00:00 bdi-default
12 ? 00:00:00 kintegrityd
13 ? 00:00:00 kblockd
14 ? 00:00:00 ata_sff
15 ? 00:00:00 khubd
16 ? 00:00:00 md
19 ? 00:00:00 khungtaskd
20 ? 00:00:00 kswapd0
21 ? 00:00:00 ksmd
22 ? 00:00:00 khugepaged
23 ? 00:00:00 fsnotify_mark
24 ? 00:00:00 ecryptfs-kthrea
25 ? 00:00:00 crypto
33 ? 00:00:00 kthrotld
34 ? 00:00:00 scsi_eh_0
36 ? 00:00:00 scsi_eh_1
37 ? 00:00:00 kworker/u:3
192 ? 00:00:00 scsi_eh_2
213 ? 00:00:00 jbd2/sda1-8
214 ? 00:00:00 ext4-dio-unwrit
Messages postés
69
Date d'inscription
mercredi 27 janvier 2010
Statut
Membre
Dernière intervention
16 avril 2013

en gros j'aimerai cette initialisation est correcte pour ces deux variables :

String patternStr1="[0-9]*"; ///pour PID
String patternStr2="*[^0-9]*"; /// pour CMD
Messages postés
69
Date d'inscription
mercredi 27 janvier 2010
Statut
Membre
Dernière intervention
16 avril 2013

bonjour Julien
mes deux variable PatternStr1 et PatternStr2 ne sont pas correct pour récupérer PID et le CMD
je sais pas trop comment les utilisés;
si tu vois stp comment résoudre ça ,,
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
360
C'est bien à toi que j'avais expliqué comment récupérer les PID de la commande TASKLIST sous Windows ?

Si c'est le cas, et que tu as toujours le code associé, tu peux l'utiliser avec cette regex : ([0-9]+).* pour les PID.

Mais, ce n'est pas une bonne idée, je m'explique, sous windows, le listing commence par le nom du process qui peut contenir des espaces. Sous unix/linux, c'est différent, le nom du processus est en dernier et ne peut pas contenir d'espace.

Il est donc plus simple d'utiliser soit StringTokenizer soit split.

A ta place, je lancerait la commande
ps -e | awk '{print $1";"$4;}'


Et j'utiliserais StringTokenizer de cette manière :

StringTokenizer st = new StringTokenizer(ligne, ";");
System.out.println("PID:"+st.nextToken());
System.out.println("Processus:"+st.nextToken());
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
360
Et oui : un même problème mais les solutions les plus adaptées sont différentes...
Messages postés
69
Date d'inscription
mercredi 27 janvier 2010
Statut
Membre
Dernière intervention
16 avril 2013

merci pour tes explication Julien, mais juste j'ai une question la commande :
("ps -e | awk '{print $1","$4;}'");
eclipse ne la pas accepté lorsque je fait la correction proposé il se reduit à :
"ps -e | awk '{print $1"
est ce que ta utilisé la methode exec avec combien de paramétres ,??
merci d'avance
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
360
Et bien oui, forcément, il faut lui dire que les "" ce ne sont pas des fins de String
"ps -e | awk '{print $1";"$4;}'"

Utilise un ; comme séparateur, ce n'est pas pour rien si c'est celui qui est utilisé dans les csv. La virgule est un séparateur qui a un autre sens.
Messages postés
69
Date d'inscription
mercredi 27 janvier 2010
Statut
Membre
Dernière intervention
16 avril 2013

désolé ,mais ça affiche rien
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
360
Je ne comprend pas pourquoi. Tu as tapé la commande dans ton terminal ?
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
360
Attends, Runitime ne gère pas les redirections, il doit également avoir du mal avec les |.

Il faut donc oublier l'appel de awk pour faire un ps -e tout simple.

Ensuite, étant donné que la chaine contient des informations que tu ne souhaites pas avoir, je te conseil de faire un split plutot que StringTokenizer :

String[] mots = ligne.split("\\p{Space}");
System.out.println(mots[0]);
Messages postés
69
Date d'inscription
mercredi 27 janvier 2010
Statut
Membre
Dernière intervention
16 avril 2013

merci julien
j'ai déja fait cette solution ,mais dans la variable mots on a tous les informations que la commande :ps -e nous sort.

tu crois que c'est faisable avec les pattern et matcher?
par ce que moi je vois que c'est la seul solution pour récupérer mes données utiles , je vois pas d'autre solution.

merci
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
360
Oui, c'est normal. C'est faisable avec Pattern mais tu auras le même problème.

J'ai appelé la méthode split sur ligne, ca veut dire que cette méthode extrait les infos d'une ligne, il faut d'abord que tu fasses un split \n
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
360
Attends une seconde, je te fais ca.
Messages postés
6414
Date d'inscription
mardi 8 mars 2005
Statut
Modérateur
Dernière intervention
29 juillet 2020
360
Dans ce cas, il vaudrait mieux renommer la variable mots par lignes, ce serait plus logique.