Linux :recuperer les pid de tous les Process qui tounent avec Java [Résolu]

controlleur 69 Messages postés mercredi 27 janvier 2010Date d'inscription 16 avril 2013 Dernière intervention - 19 mars 2012 à 10:43 - Dernière réponse : cs_Julien39 6449 Messages postés mardi 8 mars 2005Date d'inscription 15 mars 2018 Dernière intervention
- 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) {
}


}



}
Afficher la suite 

17 réponses

Répondre au sujet
cs_Julien39 6449 Messages postés mardi 8 mars 2005Date d'inscription 15 mars 2018 Dernière intervention - 19 mars 2012 à 15:38
+3
Utile
	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]);
}
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cs_Julien39
controlleur 69 Messages postés mercredi 27 janvier 2010Date d'inscription 16 avril 2013 Dernière intervention - 19 mars 2012 à 10:46
0
Utile
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) {
}


}



}
Commenter la réponse de controlleur
cs_Julien39 6449 Messages postés mardi 8 mars 2005Date d'inscription 15 mars 2018 Dernière intervention - 19 mars 2012 à 10:55
0
Utile
Bonjour,

Essayes avec la commande ps -e
Commenter la réponse de cs_Julien39
controlleur 69 Messages postés mercredi 27 janvier 2010Date d'inscription 16 avril 2013 Dernière intervention - 19 mars 2012 à 11:33
0
Utile
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
Commenter la réponse de controlleur
controlleur 69 Messages postés mercredi 27 janvier 2010Date d'inscription 16 avril 2013 Dernière intervention - 19 mars 2012 à 11:39
0
Utile
en gros j'aimerai cette initialisation est correcte pour ces deux variables :

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

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.