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

Langage Perl Discussion :

Vérifier si un processus est actif


Sujet :

Langage Perl

  1. #1
    Expert éminent

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Points : 6 686
    Points
    6 686
    Par défaut Vérifier si un processus est actif
    Bonjour

    J'ai écris un petit script en sh afin de déterminer si mon programme est lancé ou pas. Voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    #!/bin/sh
     
    pidcsup="csup"
     
    if [ ' ' != "`pidof $pidcsup`" ]
          echo "running"
    else
          echo "stopping"
    fi
    J'essaye de réécrire ce code en perl, ce qui donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #!/usr/bin/perl -w
     
    use strict;
     
    my $pidcsup="csup";
     
    if (!= system ("/usr/local/bin/pidof $pidcsup")) {
         print "running";
    else
         print "stopping";
    }
    Je n'ai aucun résultat. Si vous avez des idées, je suis preneur.

    Merci
    .Olivier

  2. #2
    Expert éminent

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Points : 6 686
    Points
    6 686
    Par défaut
    Bon, j'ai avancé un peu. Voici mon code entier:
    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
    24
     
    #!/usr/bin/perl -w
     
    ## BEGIN
     
    use strict;
     
    # variables
    my $logfiles="/var/log/pupd.log";
    my $process="csup";
    my $pid=exec("/usr/local/bin/pidof $process");
     
    # tests
    if (! -e $logfile) {
        print "unavailable\n";
    }elsif (-z $logfile) {
        print "standby\n";
    }elsif (-z $pid) {
        print "updating\n";
    }elsif (! -z $logfile) {
        system ("/bin/cat $logfile");
    }
     
    ## END
    Les explications:

    - Le fichier de log est abscent, j'affiche "unavailable"
    - Le fichier de log est vide, j'affiche "standby"
    - Le processus est actif, j'affiche normelement "updating"
    - Le fichier de log n'est pas vide, j'affiche son contenu

    Le problème est le suivant, au lieu de m'afficher "updating", s'affiche directement le PID

    Je ne comprends pas, pouvez-vous me renseigner à ce sujet ?

    Merki

    PS:cvsup est un outil sous FreeBSD de mises à jour
    .Olivier

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Points : 208
    Points
    208
    Par défaut
    Salut,

    pour récupèrer la sortie d'une commande on peut utiliser les apostrophes inverses ou l'opérateur qx{}

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $pid = qx{/usr/local/bin/pidof "$process"};
    -z c'est un test de fichiers et pas de variable et dans ton cas $pid ne contient pas un chemin vers un fichier mais un ou plusieurs PIDs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if ($pid eq ''){
       print "pas de pid\n";
    } else {
      print "le processus $processus est en marche\n";
    }
    lami20j
    --
    lami20j

  4. #4
    Expert éminent

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Points : 6 686
    Points
    6 686
    Par défaut
    Je reviens car je ne dois pas être bien doué

    Voici le code:
    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
     
    #!/usr/bin/perl -w
     
    ## BEGIN
     
    use strict;
     
    # variables
    my $logfile="/var/log/pupd.log";
    my $process="csup";
    my $pid=qx{/usr/local/bin/pidof "$process"};
     
    if ($pid eq '') {
           print "updating\n";
         }elsif (! -e $logfile) {
           print "unavailable\n";
         }elsif (-z $logfile) {
           print "standby\n";
         }elsif (! -z $logfile) {
           system("/bin/cat $logfile");
         }
     
    ## END
    Lorsque le processus est actif, cela me renvoit toujours "standby"

    Une idée ?

    Merci
    .Olivier

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Points : 208
    Points
    208
    Par défaut
    Salut,

    c'est parce que ton fichier de log existe mais il est vide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    }elsif (! -e $logfile) {  # s'il n''existe pas alors affiche unavailable
        print "unavailable\n";
    }elsif (-z $logfile) {    # s'il existe mais de taille nulle affiche standby
        print "standby\n";
    affiche ici le résultat de la commande du -sh /var/log/pupd.log

    --
    lami20j

  6. #6
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut
    Bonjour,

    Pour information, la fonction exec est à peu près équivalente à celle du même nom en C : elle écrase le programme du processus courrant par celui passé en paramètre. Donc dans ton deuxième code, les if n'étaient jamais exécutés.

    Sinon, pour une liste des différents tests sur fichier, je conseille la FAQ Perl.
    On y apprend que l'option -s permet de tester si un fichier existe et à une taille de 0.
    "En essayant continuellement, on finit par réussir. Donc : plus ça rate, plus on a de chances que ça marche" (devise Shadock)
    Application :

    ainsi qu'à regarder la avant de poser une question.

    La rubrique Perl recrute, contactez-moi.

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Points : 208
    Points
    208
    Par défaut
    Salut,
    Citation Envoyé par Woufeil
    Bonjour,

    On y apprend que l'option -s permet de tester si un fichier existe et à une taille de 0.
    Pas tout à fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ~$ ls -lh fichier_*
    -rw-r--r-- 1 lami20j lami20j 17 2007-03-11 11:25 fichier_nonvide
    -rw-r--r-- 1 lami20j lami20j  0 2007-03-11 11:24 fichier_vide
    ~$ perl -e ' -s "fichier_vide" and print "fichier vide\n"'
    ~$ perl -e ' $taille = -s "fichier_vide" and print "fichier vide $taille\n"'
    ~$ perl -e ' -z "fichier_vide" and print "fichier vide\n"'
    fichier vide
    ~$ perl -e ' -s "fichier_nonvide" and print "fichier nonvide\n"'
    fichier nonvide
    ~$ perl -e ' $taille = -s "fichier_nonvide" and print "fichier nonvide $taille\n"'
    fichier nonvide 17
    ~$
    -s fichier de taille non nulle (renvoie la taille)
    -z fichier de taille nulle

    P.S. Extrait de la FAQ
    -s Le fichier ou le répertoire existe et a une taille différente de 0
    --
    lami20j

  8. #8
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut


    J’assume pleinement la responsabilité de cet échec et j’en tire les conséquences en me retirant de la vie de la rubrique Perl

    Désolé, voilà ce que c'est que d'écrire trop vite
    "En essayant continuellement, on finit par réussir. Donc : plus ça rate, plus on a de chances que ça marche" (devise Shadock)
    Application :

    ainsi qu'à regarder la avant de poser une question.

    La rubrique Perl recrute, contactez-moi.

  9. #9
    Expert éminent

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Points : 6 686
    Points
    6 686
    Par défaut
    Bonjour les gars

    Pour répondre à la question de Monsieur lami20j, voici le résultat de la commande:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    du -sh /var/log/pupd.log
    donc:
    Si j'ai bien compris, je ne peux pas faire le test du fichier vide ? Comment dois-je m'y prendre dans ce cas pour que tous les tests soient pris en ligne de compte ?

    Merci
    .Olivier

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Points : 208
    Points
    208
    Par défaut
    Re,
    Citation Envoyé par Olivier Regnier
    Si j'ai bien compris, je ne peux pas faire le test du fichier vide ? Comment dois-je m'y prendre dans ce cas pour que tous les tests soient pris en ligne de compte ?
    Ton teste fonctionne
    Quand il existe mais il est vide il affiche standby

    Au lieu de standby ça sera mieux d'afficher par exemple
    pas d'activité enregistrée pour le processus
    lami20j
    --
    lami20j

  11. #11
    Expert éminent

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Points : 6 686
    Points
    6 686
    Par défaut
    Oui mais si je lance la mise à jour avec mon autre script, cela devrait m'afficher "updating" non "standby" si tu vois ce que je veux dire

    En script shell, ça fonctionne, voici le code:
    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
     
    #!/bin/sh
     
    ## BEGIN
     
    # variables
    logfile="/var/log/pupd.log"
     
    if [ ' ' != "`pidof csup`" ]; then
    echo "updating"
       else if [ ! -e $logfile ]; then
           echo "unavailable"
        else if [ ! -s $logfile ]; then
            echo "standby"
          else if [ -s $logfile ]; then
              echo "`cat $logfile | awk '{ print $6 }'`"
          fi
        fi
      fi
    fi
     
    ## END
    Je souhaite réecrire ce code en perl mais comment ?
    .Olivier

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Points : 208
    Points
    208
    Par défaut
    Tu teste le fichier journal qui à priori ne contient rien.

    Normalement updating tu dois l'obtenir pendant la mise à jour, si j'ai bien compris.
    En ce cas pourquoi tu fait le test
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    if ( $processus eq ''){
      print "updating\n";
    }
    ???

    Normalement tu devrais écrire
    Si le processus eq avec UnNumeroPID {
    affiche "Updating"
    }
    --
    lami20j

  13. #13
    Expert éminent

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Points : 6 686
    Points
    6 686
    Par défaut
    Si le processus eq avec UnNumeroPID {
    affiche "Updating"
    }
    Je comprend mieux, je vais tester.

    J'ai testé hier avec la ligne suivante en perl:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my cmd=`/bin/ps -f | grep csup | awk '{ print $2 }'`;
    mais j'obtiens le message suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Use of uninitialized value in concatenation (.) or string at ./checkstatus.pl  line 10.
    Merci
    .Olivier

  14. #14
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Points : 208
    Points
    208
    Par défaut
    On a déjà vu ça.
    Pour recuperer la sortie d'une commande on utilise qx{} (à savoir qu'on peut aussi utiliser qx//, qx() )

    Et tu récupere déjà le(s) PID(s) avec pidof.


    C'est plutôt la façon dont tu veux obtenir les résultats que ça te pose des problèmes.

    Je vais regarder ton script shell et je vais l'écrire en Perl.
    --
    lami20j

  15. #15
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Points : 208
    Points
    208
    Par défaut
    Essaie ça
    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
    #! /usr/bin/perl
    use warnings;use strict;
     
    my $logfile="/var/log/pupd.log";
     
    if (`pidof csup` ne ' '){  # si le processus en marche
        print "updating\n";
    }else if ( ! -e $logfile ){# si le fichier n'existe pas
        print "unavailable\n";
    }else if ( ! -s $logfile ){# negation de -s
        print "standby\n";
    }else if ( -s $logfile ){  # -s le fichier existe et taille non nulle
        print `cat $logfile | awk '{ print $6 }'`,"\n";
    }
    __END__
    --
    lami20j

  16. #16
    Expert éminent

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Points : 6 686
    Points
    6 686
    Par défaut
    Je viens de tester ton code mais la statut est toujours sur "updating"
    .Olivier

  17. #17
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Points : 208
    Points
    208
    Par défaut
    au lieu demets
    Si ça ne marche pas, alors je crois que c'est le moment de dire ce que tu veux obtenir en français et pas en Perl

    En bref affiche le résultat que tu obtiens avec ton script shell, dans tous les cas traité pour voir.
    Merci.
    --
    lami20j

  18. #18
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Points : 208
    Points
    208
    Par défaut
    Et ne soit pas triste
    C'est en fait relatif simple ce que tu veux obtenir.
    Il doit avoir une mal interpretation quelque part.
    --
    lami20j

  19. #19
    Expert éminent

    Homme Profil pro
    Technicien Help Desk
    Inscrit en
    Juillet 2004
    Messages
    2 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Technicien Help Desk

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 756
    Points : 6 686
    Points
    6 686
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (`pidof csup` ne ' '){  # si le processus en marche
        print "updating\n";
    Ce n'est pas possible ce qui est écrit ci dessus ? Automatiquement, il affichera qu'il stoppé non avec ne ' '

    Qu'en penses-tu ?
    .Olivier

  20. #20
    Membre actif
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    172
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 172
    Points : 208
    Points
    208
    Par défaut
    D'abord je veux signaler une erreur de syntaxe que j'ai fait

    Il n'y a pas de else if en Perl.
    En revanche il y a elsif


    Ce n'est pas plutôt ça que tu veux?

    SI le processus en en marche ALORS
    affiche updating
    SINON
    SI le fichier journal n'existe pas LALORS
    .....
    SINON SI ! -s fichier ALORS
    ......
    SINON SI -s fichier ALORS
    ......
    FIN SI
    FIN SI
    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
    #! /usr/bin/perl
    use warnings;use strict;
     
    my $logfile="/var/log/pupd.log";
    my $pid = `pidof httpd`;
     
    if ($pid ne ''){         # si le processus en marche
        print "updating\n";  # j'affiche que la mise à jour est en cours
    } else {                     # si la mise à jour est fini ou pas commencer
                                 # pas de processus
            if ( ! -e $logfile ){         # si le fichier n'existe pas
                    print "unavailable\n";# j'affiche non dispo
            }elsif ( ! -s $logfile ){     # negation de -s
                    print "standby\n";    # j'affiche standby
                                          # mais je ne comprends pas
            }elsif ( -s $logfile ){  # -s le fichier existe et taille non nulle
                                     # j'affiche le contenu de fichier
                    print `cat $logfile | awk '{ print $6 }'`,"\n";
            }
    }
    __END__
    --
    lami20j

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [Batch] Vérifier si un processus est lancé ou non ?
    Par hackoofr dans le forum Scripts/Batch
    Réponses: 6
    Dernier message: 25/04/2014, 21h13
  2. Vérifier si un processus est lancé ou non
    Par AZzjeioafh dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 03/12/2009, 18h55
  3. Réponses: 5
    Dernier message: 20/07/2009, 17h04
  4. Vérifier qu'un démon est toujours actif
    Par GLDavid dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 16/03/2007, 21h23
  5. Vérifier si un process est actif
    Par Olivier Regnier dans le forum Linux
    Réponses: 3
    Dernier message: 10/03/2007, 01h38

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