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

Programmation et administration système Perl Discussion :

mon script ne trouve pas le bon processus


Sujet :

Programmation et administration système Perl

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    Par défaut mon script ne trouve pas le bon processus
    Bonjour,

    J'ai fais un script pour arreter puis redémarrer un demon après la vérification du PID . Apparemment il fonctionnait très bien hier et sans aucune modification de ma part il ne fonctionne plus ce matin .

    Mon problème vient dans la partie de la vérification du PID. En effet celui est déja arrèté et mon script me trouve toujours un PID. Extrait du script :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/usr/bin/perl
    use warnings;
    use strict;
    my $daemon="dori";
    my $ED="Doce";
    my $lmpid1=`ps -ef | grep $daemon | egrep -v grep | awk '{print \$3}'`;
    my $lmpid2=`ps -ef | grep $daemon | egrep -v grep | awk '{print \$4}'`;
    if ($lmpid1) {
            die "[Error] $ED license server doesn't want to stop.\n $daemon is running with PID : $lmpid1 \n or lmgrd is still running with PID : $lmpid2 \n" ;
    }
    Il me retourne ceci :
    [Error] Doce license server doesn't want to stop.
    dori is running with PID : 17667

    or lmgrd is still running with PID : 0

    Cela est bizarre parce que quand je vérifie le PID 17667 voici ce que j'ai :
    ~]# ps -aef | grep 17667
    root 17667 17666 0 11:17 pts/5 00:00:00 -bash
    root 18215 17667 0 11:40 pts/5 00:00:00 ps -aef
    root 18216 17667 0 11:40 pts/5 00:00:00 grep 17667

    Comme pourrais je avoir le bon PID pour que la vérification fonctionne à tous les coups ?

    Merci de votre aide....

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    Par défaut
    J'ai essayé une autre solution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    my $pid=`ps -ef | grep $daemon | grep -v \"\\(log\\|grep\\)\"` ;
    print "[flag] "print $pid\n";
    my @pid=split(/\s+/,$pid);
    if ($pid) {
            die "[Error] $EDA license server doesn't want to stop.\n $daemon is running with PID : $pid[1] \n or lmgrd is still running with PID : $pid[2] \n" ;
    }

    J'ai pu decouvrir que le ps prenait en compte mon script.pl que j'avais nomé : dori_restart.pl
    Donc ma variable $pid prenait la valeur :

    [Flag] root 21470 17667 0 14:37 pts/5 00:00:00 /usr/bin/perl ./dori_restart.pl

    Baloo

    J'ai donc modifié ma ligne comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $pid=`ps -ef | grep $daemon | grep -v \"\\(log\\|grep\\|perl\\)\"` ;
    Merci ....

  3. #3
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Pourquoi n'utilises-tu pas perl pour traiter directement le résultat de ps -ef ?
    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
     
    my @pid = qw(ps -ef);
    my $daemon_re = quotemeta $daemon;
    @pid = grep { /$daemon_re/ && !/log|grep/ } @pid;
    if (@pid == 1) {
      print "one PID found !\n$pid[0]\n";
      my @pid_info = split /\s+/, $pid[0];
      die "[Error] $EDA license server doesn't want to stop.\n $daemon is running with PID : $pid_info[1] \n or lmgrd is still running with PID : $pid_info[2] \n" ;
    }
    elsif (@pid == 0) {
      print "No PID found\n" if @pid == 0;
    }
    else {
      print "More than one PID found: ", (map "$_\n", @pid);
    }
    (je n'ai pas testé)

  4. #4
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 498 771
    Points
    498 771
    Par défaut
    Utilise le module Proc::ProcessTable pour connaitre très facilement les processus en cours sur ton serveur.

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    Par défaut
    J'ai modifié mon post alors que vous aviez écrits une réponse ..... J'espère ne pas avoir mis le "mess"

    Tu as raison Philou à mon niveau c’était fastidieux, mais avec ton coup de pouce j'ai étudié cette solution qui est devenue :
    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
    my @pid = `ps -ef`;
    #print "[Flag] @pid\n";
    @pid = grep { /$daemon/ && !/log|grep|perl/ } @pid;
    #print "[Flag] @pid\n";
    if (@pid == 0) {
    print "one PID found !\n $pid[0]\n";
      my @pid_info = split /\s+/, $pid[0];
      die "[Error] $EDA license server doesn't want to stop.\n $daemon is running with PID : $pid_info[1] \n or lmgrd is still running with PID : $pid_info[2] \n" ;
    }
    elsif (@pid == 0) {
      print "No PID found\n" if @pid == 0;
    }
    else {
      print "More than one PID found: ", (map "$_\n", @pid);
    }
    J'ai cependant une question sur la lignes suivantes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    elsif (@pid == 0) {
      print "No PID found\n" if @pid == 0;
    car apparemment il y a 2 conditions dont je ne vois pas la différence ... ou faut-il réellement l'utiliser comme indiqué

    Merci

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Naturellement, il faudrait adapter ce que j'ai proposé à l'usage du module proposé par Djibril.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    Par défaut
    Bonjour,

    La ligne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     my @pid_info = split /\s+/, $pid[0];
    me remonte l'erreur suivante :
    Use of uninitialized value in split at ./licence_restart.pl line 35
    J'ai essayé en introduisant la ligne my $pid="";
    mais cela ne résoud pas mon problème .....

  8. #8
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    C'est parce que tu as mal recopié ce que je t'ai donné en exemple.
    Le premier if doit être ainsi :

    En effet, si tu exécutes un split alors que @pid == 0 (c'est à dire que @pid est vide), le split va échouer

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    Par défaut
    Bonjour,

    En fait j'avais mit le split avant la conditions comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    my @pid = `ps -ef`;
    @pid = grep { /$daemon/ && !/log|grep|perl/ } @pid;
    my @lmpid = split /\s+/, $pid[0];
    if (@pid == 1) {
            print "[Error] The daemon still running:\n $pid[0]\n"; 
            die "[Error] $EDA license server doesn't want to stop.\n $daemon is running with PID : $lmpid[1] \n or lmgr
    d is still running with PID : $lmpid[2] \n" ;
            } elsif (@pid == 0) {
            print  "\n\nThe $EDA license daemon is stopping on $host\n" if @pid == 0;
            } else { 
            die "[Error] Kill the process manually and restart it, because \n the script has got a but \nas more than
     one PID found: \n", (map "$_\n", @pid);
    }
    En le mettant le split apres le premier if, comme Philou m'a corrigé, l'erreur disparaît mais je ne comprend pas bien pourquoi puisque $pid[0] est une colonne de @pid qui initialisée dans la ligne du dessus.
    Mais j'ai remarqué que $pid[1] est vide tant que l'on ne fait pas de split, c'est donc un tableau à une seule colonne.
    Merci de vos lumières....

  10. #10
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Points : 5 753
    Points
    5 753
    Par défaut
    Non, @pid ne contient pas les colonnes du processus rechercher. Il contient toutes les lignes de ps -ef qui ont été passées au tamis de grep. Il peut donc contenir une ligne ($pid[0]) si L'UNIQUE processus a été trouvé, ou plusieurs lignes si le grep n'est pas assez restrictif, voir encore aucune ligne si le processus n'est pas trouvé.
    Les colonnes du processus sont dans @lmpid, une fois le split effectué sur la ligne $pid[0] (si c'est l'unique processus trouvé). J'ai pris pour hypothèse que si le filtre donne 0 ou plus d'un processus, cela constituait une erreur.

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    299
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 299
    Points : 137
    Points
    137
    Par défaut
    Merci Philou je vais étudier ça .......

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Mon script ne marche pas :(
    Par Diabless6 dans le forum Général JavaScript
    Réponses: 12
    Dernier message: 04/04/2007, 20h58
  2. mon script n'apparait pas
    Par gtraxx dans le forum Langage
    Réponses: 4
    Dernier message: 20/10/2006, 18h47
  3. [FEDORA] Makefile qui trouve pas le bon path
    Par pierabobl dans le forum RedHat / CentOS / Fedora
    Réponses: 8
    Dernier message: 10/08/2006, 11h55
  4. Pourquoi mon script ne marche pas?
    Par amarcil dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 30/05/2006, 21h37
  5. Tcsh - Mon script ne marche pas
    Par Aramis dans le forum Linux
    Réponses: 5
    Dernier message: 13/05/2004, 18h26

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