IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

tuer un process quand il nous rend pas la main


Sujet :

avec Java

  1. #1
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    146
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 146
    Points : 93
    Points
    93
    Par défaut tuer un process quand il nous rend pas la main
    Bonjour,

    J ai utilisé l'API SHELL d'ADIGUBA dont voici la ligne de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Shell.system("systeminfo /s "+IP+" /u "+user+" /p "+pass+" > Temp\\blabla.txt 2<&1");
    donc jusque là ça marche niquel malheureusment j arrive sur un pc qui nous embete et la commande ne se termine jamais ce qui fait que je ne recupere pas la main et le programme est bloqué.
    je pensais mettre une sorte de timer avec un temps limite et a la fin du temps killer le process et sortir de la fonction puis reprendre le cours du programme
    je cherche sur google et sur la faq mais je ne vois pas trop

    merci de votre aide.

  2. #2
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Java n'a pas, en standard, de mécanisme pour envoyer des signaux aux autres process, et donc à priori pour les killer. Une solution, sous unix, c'est d'exécuter la commande "kill" qui est une application à part entière, en lui passant le numéro de process à killer.

  3. #3
    Expert éminent sénior
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Mais on peut tuer un process que l'on a lancé

    Avec mon API shell il faut utiliser la méthode consumeInBackground() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Shell shell = new Shell();
    Future<Integer> cmd = shell.command("systeminfo /s "+IP+" /u "+user+" /p "+pass+" > Temp\\blabla.txt 2<&1").consumeInBackground();
     
    // Le process s'exécute en tâche de fond
    int result = cmd.get(); // pour récupérer la valeur de retour (s'il est terminé)
     
    cmd.cancel(true); // pour annuler (et donc tuer) le process
    a++

  4. #4
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    146
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 146
    Points : 93
    Points
    93
    Par défaut
    bonjour,
    je dois maintenant pouvoir tuer le process que si il n est pas fini dans les 10 minutes.
    Je me disait que j allais declencher une sorte de chrono ou timer mais si le process ne me rend pas la main je ne peux plus faire une condition sur le temps ecoulé
    je ne trouve pas de solution
    merci de vote aide

  5. #5
    Membre confirmé Avatar de miloux32
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    545
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 545
    Points : 565
    Points
    565
    Par défaut
    Citation Envoyé par lerab51 Voir le message
    bonjour,
    je dois maintenant pouvoir tuer le process que si il n est pas fini dans les 10 minutes.
    Je me disait que j allais declencher une sorte de chrono ou timer mais si le process ne me rend pas la main je ne peux plus faire une condition sur le temps ecoulé
    je ne trouve pas de solution
    merci de vote aide
    Tu lances un thread en tache de fond avant de démarrer ton process.
    ton Thread attend X minutes (10 dans ton cas) et kille ton process s'il tourne encore, sinon ton thread s'arrete
    C'est pas parce que ca marche que c'est bon!!
    Pensez au bouton "Résolu"
    Je ne réponds pas en privé aux questions

  6. #6
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    146
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 146
    Points : 93
    Points
    93
    Par défaut
    ouais merci j essaie avec le thread mais je debute avec le thread ce n est pas evident ce truc a ajouter dans un programme
    j y retourne
    encore merci

  7. #7
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    146
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 146
    Points : 93
    Points
    93
    Par défaut
    bah en fait j ai toujours pas reussi
    j ai un peu beaucoup de mal la je dirais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Shell shell = new Shell();
    Future<Integer> cmd = shell.command("systeminfo /s "+IP+" /u "+user+" /p "+pass+" > Temp\\blabla.txt 2<&1").consumeInBackground();
     
    // Le process s'exécute en tâche de fond
    int result = cmd.get(); // pour récupérer la valeur de retour (s'il est terminé)
     
    cmd.cancel(true); // pour annuler (et donc tuer) le process
    donc faut que je mette ce code dans un thread avec un autre thread a cote qui compte et qui lorsque il arrive a 1000 par exemple tue l autre thread


    bon si vous avez des conseils merci je rattaque mais ça fait un moment que je n avais pas eu le bug dans le programme c est a dire un systeminfo qui ne se finit jamais

    merci

  8. #8
    Membre habitué
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2007
    Messages : 132
    Points : 170
    Points
    170
    Par défaut
    Personnellement j'ai déjà rencontré le même problème que toi.
    Le problème est que la méthode Process.destroy ne détruit pas tout le temps
    le process (surtout sur windows)

    Et la classe Process ne possède pas de méthode getPid().

    Voilà comment j'ai résolu le problème (fonctionne sur Solaris et Windows):

    1) Premièrement implémentation d'un librarie dynamique proche du système me permettant de faire des actions liés à un process (liste de process, info sur un process, tuer un process ...)
    Je sais c'est ch.... une librarie dynamique en Java mais là, on n'a pas le choix.

    2) Pour récupérer le PID j'utilise un programme intermédiaire qui retourne s on PID dans l'output et ensuite execute le programme normalement par exemple le code pour solaris est super simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    #include<unistd.h>
    #include<errno.h>
    #include<stdio.h>
    #include<sys/types.h>
    #include<string.h>
    extern int errno;
     
     
     int main (int argc, char **argv) {
     
       printf ("PID=%d\n",getpid());
    fflush(stdout);
       if (argc <=1){
    		   printf ("Not enough parameters\n");
    		   return -1;
       }
     
       	execvp(argv[1],&argv[1]);
     
        //if all is ok, this line is not executed.
       	printf ("Error : %s\n", strerror(errno));
       return errno;
     }
    3) donc lorsque l'on lance un programme la première ligne est toujours le PID du process ensuite si le programme prend trop de temps je le tue (ainsi que ces fils) grace à la librarie dynamique.

    C'est vrai que ça demande un peu de boulot, mais une fois que c'est fait tu ne te poseras plus jamais le problème de savoir si tu peux ou pas tuer le programme que tu as lancé.

Discussions similaires

  1. Réponses: 9
    Dernier message: 16/11/2007, 11h33
  2. Réponses: 1
    Dernier message: 15/05/2007, 09h16
  3. le Timer ne me rend pas la main
    Par toxycyty dans le forum Windows
    Réponses: 10
    Dernier message: 08/11/2006, 16h54
  4. RMAN ne rend pas la main
    Par big1 dans le forum Recovery Manager
    Réponses: 3
    Dernier message: 29/08/2006, 20h18
  5. Script CMD qui ne rend pas la main
    Par ipeteivince dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 10/06/2005, 11h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo