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 :

Moniteur et verification exsitance.


Sujet :

Programmation et administration système Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Bio-informaticienne
    Inscrit en
    Septembre 2009
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Bio-informaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2009
    Messages : 97
    Par défaut Moniteur et verification exsitance.
    Alors voila j'ai un petit probleme avec un moniteur ...

    J'ai un programme monitor.pl, ce programme roule toujours sur une de mes machines il gere un service web....
    Les gens peuvent venir sur le site web deposer une requete la requete est ensuite traiter et un mail et envoyer avec le resultat de la requete.

    Le programme qui roule en arriere est pas mal lourd il mais parfois 20min/30min a rouler c'est pour ca que j'ai mis en place un systeme de monitoring qui gere une file... ce qui permet de ne pas surcharger la machine.

    La mise en route du moniteur est gerer par un script de demarrage qui est mis en route par un cron job:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    */10 * * * * /bin/bash /bin/startup_script.sh
    ce script source le bashrc ce met dans le bon repertoire est lance le moniteur....

    Comme je ne veux pas qu'un nouveau moniteur soit creer toute les 10 minutes et que celui-ci deviennent persistant ....

    le moniteur verifie l'existance d'un autre moniteur et exit si un autre moniteur existe deja. Cette fonction est comprise dans la sous routine suivante :

    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
    sub CheckIfRun {
            my $ps_fh = new IO::Pipe;
            $ps_fh->reader(("ps -ef | grep perl"))
               or die "Can't open pipe from 'ps'.\n";
            my @ps_out = <$ps_fh>;
            $ps_fh->close();
     
            my $Exist = 0;
            foreach my $line (@ps_out){
               next if $line !~ m/perl monitor\.pl;
               $Exist += 1;
            }
     
            exit 0 if $Exist > 1;
    }
    seulement il m'arrive que deux moniteurs deviennent persistant... et ca je ne comprend pas. Est ce que quelqu'un a une idee le moniteur le plus ancien ne semblant ne plus etre actif...

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 134
    Par défaut
    Bonjour,

    c'est difficile de répondre comme ça mais est-il possible de faire des print de ce que fait ton perl_monitor.pl dans un fichier de log, de cette façon dès qu'il y'a une erreur ou que le perl_monitor est lancé une deux fois de suite tu peux voir le pourquoi du comment.

    Sinon franchement e te conseille d'utiliser plutôt un seule fichier avec un thread (pour chaque traitement) et un semaphore pour géré la file d'attente.

    P.S : c'est normal le espace entre perl et monitor dans ta regexp ?

    Cdt

  3. #3
    Membre confirmé
    Femme Profil pro
    Bio-informaticienne
    Inscrit en
    Septembre 2009
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Bio-informaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2009
    Messages : 97
    Par défaut
    Je remonte se sujet car cela viens de nouveau de se produire je ne comprend pas je n'ai pas de consisantance.

    En effet j'ai trois moniteurs differents car j'ai 3 differrents programmes a gerer. Disons moniteur1, moniteur2, moniteur3.

    Dans mon crontab j'ai:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    */10 * * * * bash startup_script_moniteur1.sh
    */5 * * * *   bash startup_script_moniteur2.sh
    */5 * * * *   bash startup_script_moniteur3.sh
    Les script de demarrage des moniteur ne font que loader des variable d'environnement ce mettre dans le bon dossier puis lance les moniteurs.

    Les 3 fonctionnent pas mal de la meme facon. Comme je l'ai dit dans mon message precedent, le moniteur qui est lancer a un temps X verifie l'existance d'un autre moniteur du meme type (grace a ps -ef |grep perl) si un moniteur du meme type existe alors le moniteur qui viens d'etre lancer exit et l'autre continue a rouler.

    Seulement cela ne semble pas fonctionner a tous les coup car parfois je me retrouve avec 2 (ou plus) moniteur du meme type persistant.

    Par exemple j'ai actuellement sur la machine les 4 moniteurs suivant qui roulent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    user     9734      1  0 Jul12 ?        00:00:00 perl monitor1.pl
    user    12384     1  0 Jul19 ?        00:00:00 perl monitor2.pl
    user    31283     1  0 Jul20 ?        00:00:01 perl monitor3.pl
    user    20412     1  0 Jul26 ?        00:00:00 perl monitor3.pl
    on peut donc voir que le moniteur3 original a ete mis en route le 20 Juillet
    ate que le second moniteur3 c'est mis en route le 26 Juillet et et rester persistant.

    Est-ce que mon probleme et clair si vous avez besoin de plus d'infos hesite pas a demander, et si vous avez une idee elle est bienvenue .

  4. #4
    Membre confirmé
    Femme Profil pro
    Bio-informaticienne
    Inscrit en
    Septembre 2009
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Bio-informaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2009
    Messages : 97
    Par défaut
    Rhooo c'est vraiment drole je recoit une reponse juste au moment de completer et de faire remonter mon post .

    Hmmm oui alors pour les print j'ai tester avec un des moniteurs pour l'instants rien de concluant car il n'est pas devenue persistant une deuxieme fois !!!

    Sinon pour la partie suivante de ta reponse je doit dire que j'ai totalement decroche :
    Sinon franchement e te conseille d'utiliser plutôt un seule fichier avec un thread (pour chaque traitement) et un semaphore pour géré la file d'attente.
    Est-ce que tu peux m'expliquer plus en detail ?

    Merci pour l'aide.

    Euhhhh ok je pense que j'ai trouver de quoi yu voulais parle :

    http://perldoc.perl.org/Thread/Semaphore.html

    Je vais regarde ca de plus pres.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 134
    Par défaut
    il y'a un exemple très bien ici fait par gardyen.

    Sinon le truc c'est de dire je ne peux lancer que 3 traitements à la fois par exemple, donc :
    -je lance le main script
    -le script check si il y'a une demande de lancement (ou autre chose qui doit lancer un traitement)
    - si c'est le cas je vérifie si je peux lancer le thread du traitement
    sinon c'est que 3 thread sont en cours alors j'attends qu'un slot soit libre pour lancer le traitement


    Il te faut juste vérifier que ton main script reste toujours actif (c'est faisable par plusieurs façon)

    Voili voila

  6. #6
    Membre confirmé
    Femme Profil pro
    Bio-informaticienne
    Inscrit en
    Septembre 2009
    Messages
    97
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Bio-informaticienne
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2009
    Messages : 97
    Par défaut
    Bon je reviens avec mon petit probleme, j'ai donc fait des print a different endroit de mon script.

    Notamment losrque ma variable $Exist <= 1 ce qui signifie qu'un nouveau moniteur doit etre lancer.

    Donc dans le cas ou $Exist <= 1 j'ai printe dans un fichier le resultat de ma commande grep. voici mon 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
    my $Exist = 0;
            foreach my $line (@ps_out){
               next if $line !~ m/perl\s+monitor1\.pl\s+\/UserFiles1/;
               $Exist += 1;
            }
     
            if ($Exist <= 1) {
    	    unless (-d $TMP_RUN) { mkdir($TMP_RUN,0777); }
    	    my $file    = "$TMP_RUN/trace";
    	    my $fh_file = new IO::File ">>$file"
    	        or die "Cannot file '$file': $!\n";
                print $fh_file "\n-----------------------------------------------------\n";
                foreach my $line (@ps_out){
    		print $fh_file "monitor $$ line : $line";
    	    }
    	    $fh_file->close();
    	}
     
            exit 0 if $Exist > 1;
    et donc voici pour exemple ce que je recupere dans mon fichier "$TMP_RUN/trace" apres que deux des moniteurs 1 soient devenu persistant :

    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
     
    -----------------------------------------------------
    monitor 31591 line : user1    31567     1  0 15:55 pts0     00:00:00 perl monitor3.pl /UserFiles3
    monitor 31591 line : user1    31578     1  0 15:55 pts0     00:00:00 perl monitor2.pl /UserFiles2
    monitor 31591 line : user1    31591     1  0 15:55 pts0     00:00:00 perl monitor1.pl /UserFiles1
    monitor 31591 line : user1    31592 31591  0 15:55 pts0     00:00:00 sh -c ps -ef | grep perl
    monitor 31591 line : user1    31594 31592  0 15:55 pts0     00:00:00 grep perl
     
    -----------------------------------------------------
    monitor 3366 line : user1    31567     1  0 15:55 pts0     00:00:00 perl monitor3.pl /UserFiles3
    monitor 3366 line : user1    31578     1  0 15:55 pts0     00:00:00 perl monitor2.pl /UserFiles2
    monitor 3366 line : user1    31591     1  0 15:55 pts0     00:00:00 perl monitor1.pl /UserFiles1
    monitor 3366 line : user1     3380     1  0 22:29 ?        00:00:00 perl monitor2.pl /UserFiles2
    monitor 3366 line : user1     3381  3366  0 22:29 ?        00:00:00 sh -c ps -ef | grep perl
    monitor 3366 line : user1     3385  3381  0 22:29 ?        00:00:00 grep perl
    Ce qui est tres tres etranges c'est que dans le resultat du 2eme grep le moniteur 1 ayant pour PID 3366 (le deuxieme a c'etre mis en route --> donc celui qui devrait ce tuer... ) ne se voit pas !!! est ce que quelqu'un aurait une explication ?

Discussions similaires

  1. Réponses: 10
    Dernier message: 22/11/2004, 22h37
  2. [API] Codage d'un moniteur de messages debug
    Par Pierre Castelain dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 15/01/2004, 19h47
  3. Verification des champs d'un formulaire
    Par 164emie dans le forum ASP
    Réponses: 5
    Dernier message: 19/11/2003, 14h03
  4. Réponses: 2
    Dernier message: 16/06/2003, 15h15
  5. verification de doublons dans un tableau
    Par bohemianvirtual dans le forum C
    Réponses: 11
    Dernier message: 25/05/2002, 12h21

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