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é)
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  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.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  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
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  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.
    Plus j'apprends, et plus je mesure mon ignorance (philou67430)
    Toute technologie suffisamment avancée est indiscernable d'un script Perl (Llama book)
    Partagez vos problèmes pour que l'on partage ensemble nos solutions : je ne réponds pas aux questions techniques par message privé
    Si c'est utile, say

  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