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

Résolu
controlleur Messages postés 65 Date d'inscription mercredi 27 janvier 2010 Statut Membre Dernière intervention 16 avril 2013 - 19 mars 2012 à 10:43
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 - 19 mars 2012 à 15:39
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) {
}


}



}

17 réponses

cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 372
19 mars 2012 à 15:38
	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]);
}
3
controlleur Messages postés 65 Date d'inscription mercredi 27 janvier 2010 Statut Membre Dernière intervention 16 avril 2013
19 mars 2012 à 10:46
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) {
}


}



}
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 372
19 mars 2012 à 10:55
Bonjour,

Essayes avec la commande ps -e
0
controlleur Messages postés 65 Date d'inscription mercredi 27 janvier 2010 Statut Membre Dernière intervention 16 avril 2013
19 mars 2012 à 11:33
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
controlleur Messages postés 65 Date d'inscription mercredi 27 janvier 2010 Statut Membre Dernière intervention 16 avril 2013
19 mars 2012 à 11:39
en gros j'aimerai cette initialisation est correcte pour ces deux variables :

String patternStr1="[0-9]*"; ///pour PID
String patternStr2="*[^0-9]*"; /// pour CMD
0
controlleur Messages postés 65 Date d'inscription mercredi 27 janvier 2010 Statut Membre Dernière intervention 16 avril 2013
19 mars 2012 à 12:28
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 ,,
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 372
19 mars 2012 à 12:45
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());
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 372
19 mars 2012 à 12:47
Et oui : un même problème mais les solutions les plus adaptées sont différentes...
0
controlleur Messages postés 65 Date d'inscription mercredi 27 janvier 2010 Statut Membre Dernière intervention 16 avril 2013
19 mars 2012 à 13:40
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
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 372
19 mars 2012 à 13:56
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.
0
controlleur Messages postés 65 Date d'inscription mercredi 27 janvier 2010 Statut Membre Dernière intervention 16 avril 2013
19 mars 2012 à 14:02
désolé ,mais ça affiche rien
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 372
19 mars 2012 à 14:20
Je ne comprend pas pourquoi. Tu as tapé la commande dans ton terminal ?
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 372
19 mars 2012 à 14:23
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]);
0
controlleur Messages postés 65 Date d'inscription mercredi 27 janvier 2010 Statut Membre Dernière intervention 16 avril 2013
19 mars 2012 à 15:09
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
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 372
19 mars 2012 à 15:29
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
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 372
19 mars 2012 à 15:29
Attends une seconde, je te fais ca.
0
cs_Julien39 Messages postés 6414 Date d'inscription mardi 8 mars 2005 Statut Modérateur Dernière intervention 29 juillet 2020 372
19 mars 2012 à 15:39
Dans ce cas, il vaudrait mieux renommer la variable mots par lignes, ce serait plus logique.
0
Rejoignez-nous