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 :

[PERL] faire tourner un script comme un service


Sujet :

Langage Perl

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut [PERL] faire tourner un script comme un service
    Bonjour à tous,
    La question que je pose est peut-être sans sens mais je la tente quand même.

    J'ai un script perl que je voudrais faire tourner comme un service sous windows 2003 server, afin qu'il tourne toutes les 10 minutes par exemples.

    Comment m'y prendre ???

    Voici mon script:

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
     
    #!c:\perl\bin\perl.exe
     
    use TX2::Tools;
     
    # Le fichier HBSTAUTO.RUN est cr dans le rpertoire c:\wsta ds lors que TX2 est en mode automatique.
    # Le script check_TX2_auto_mode.pl scrute l'existence de ce fichier et envoie un mail d'alert si tel n'est pas le cas.
    %Job;
    #Dfinition des variables
    $auto_file="c\:\\wsta\\HBSTAUTO.RUN";
    $schedule_job="c\:\\wsta\\SCHEDULE.CMD";
    $last_event="c\:\\wsta\\EVENT.TRK";
    ##Vrification du mode automate
    $date=&TX2::Tools::GetDate('franais');
    $hour=&TX2::Tools::GetDate('hour');
     
    $NowTime=substr($hour,0,4);
    $NowTime_seconde=substr($NowTime,0,2)*3600+substr($NowTime,2,2)*60;
    if(!(-e $auto_file))
    {
     
     
           &GetLastEventHour;
           &GetNextJobs;
           #print "$ListJob\n$last_check\n";
          &TX2::Tools::SendMail('Mode automatique arrt',"La station ne fonctionne plus en mode automatique.\nDate de la dernire vrification de l\'automate.\n* Liste des jobs suivants:\n$ListJob\n");
          print "\nAutomate arrete\n";
    }
    else
    {
           &GetLastEventHour;
     
    #NowTime est utils avec last_hour dans une diffrence qui donnera le temps de raffraichissement de la recherche d'vnement
     
           if($NowTime_seconde>=$last_hour_seconde)
           {
                $Elapsed_time=$NowTime_seconde-$last_hour_seconde;     
                print "$Elapsed_time";
           }
           else
           {
                $Elapsed_time=(24*3600)-abs($NowTime_seconde-$last_hour_seconde); 
                 print "$Elapsed_time";    
           }
     
    #Si la diffrence (dernier raffraichissement est suprieur  2 minutes (120 secondes)), on envoie un mail (c'est que la station est bloque)
           if($Elapsed_time > 120)
           {
                $Format_Elapsed_Time=sprintf("%02d",($Elapsed_time/3600));
                $Format_Elapsed_Time.=":".sprintf("%02d",(($Elapsed_time-($Format_Elapsed_Time*3600))/60));
                &GetNextJobs;
                &TX2::Tools::SendMail("Mode automatique arrt ou TX2 crash","La dernire vrification d'vnement remonte  $Format_Elapsed_Time.\n* Date de la dernire vrification de l\'automate: $last_check.\n* Liste des jobs suivants:\n$ListJob\n");
                print "retard\n";
           }
    }
     
     
     
     
     
    ###################################################
    ##Function GetNextJobs()
    ##Rcupration de la liste des jobs de l'automate
    ###################################################
    sub GetNextJobs()
    {
            open(fic,"$schedule_job") or die "Impossible d\'ouvrir $schedule_job $!\n";
            @tab=<fic>;
            close(fic);
            foreach(my $i=0;$i<=$#tab;$i++)
            {
                  if($tab[$i]=~/1W0/ || $tab[$i]=~/1W1/ || $tab[$i]=~/2W0/ || $tab[$i]=~/2W1/)
                  {
                        @tmp0=split(" ",$tab[$i]);
                        @tmp1=split(/:/,$tmp0[1]);
                        @tmp2=split(/=/,$tab[$i+2]);
                        $cle=$tmp1[0].$tmp1[1];
                        $Job{$cle}=$tmp2[1];
                        push(@Time,$tmp1[0].$tmp1[1]);
                  }
            }
            @Time=sort(@Time);
     
           foreach(@Time)
           {
                if($_>=$NowTime)
                {
                    $ListJob.="-".substr($_,0,2).":".substr($_,2,2). "\-\> $Job{$_}\n";
                }
           }
    }
     
     
    sub GetLastEventHour()
    {
           #Rcupration de la dernire vrification d'vnement
           open(fic,$last_event) or die "Impossible d\'ouvrir $last_event $!\n";
           @event=<fic>;
           #On isole la date et heure de dernire vrification de l'vnement fait par l'automate (utilis pour le mail)
           $last_check=substr($event[0],35,9);
           $last_check=~s/at//g;
           #On isole l'heure de la dernire vrification de l'vnement fait par l'automate (on l'utilisera pour faire la diffrence avec l'heure de lancement du batch)
           $last_hour=substr($event[0],34,5);
           $last_hour=~s/://;
           $last_hour_seconde=substr($last_hour,0,2)*3600+substr($last_hour,2,2)*60;
           close(fic);
     
    }
    Merci pour vos réponses et désolé pour la question peu claire peut-etre, mais je sais vraiment pas comment m'y prendre.
    tout le monde est d'accord pour critiquer la pensée unique

  2. #2
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    La notion de "service" a un sens particulier sous Windows, mais si tu cherches simplement à exécuter un job à intervalle régulier, la solution la plus propre est tout simplement d'utiliser le sheduler de windows et de programmer le lancement de ton script perl. Attention, on m'a souvent rapporté des petits problèmes entre le sheduler Windows et les scripts Perl... néanmoins pour y remédier il suffit (par exemple) de transformer ton script perl en .bat avec la commande perl2bat (disponible en standard sous ActivePerl).
    Si tu t'intéresse vraiment au "services" Windows, précise-le, il y a aussi des solutions.

    --
    Jedaï

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut
    Et bien, j'ai vu le scheduler, et j'aimerai avoir plus d'infos en fait.
    Avec le scheduler j epeux lancer mon programme (bat) de façon:
    * quotidienne
    * hebdomadaire
    * mensuelle
    * au démarrage

    Mais je peux pas le lancer par exemple tout les 10 minutes.
    Donc, je devrais metrte un sleep dans mon programme.
    La solution serait:

    scheduler -> au démarrage du système
    programme-> Un fonction main récursive qui se rappelle après un sleep de 10 minutes

    Est-ce que cela ne va pas me bouffer beaucoup de mémoire. Je trouve que c'est pas propre aussi

    D'autre part, si j'utilise le scheduler pour lancer le batch, je vais voir une fenêtre dos qui apparaîtra et je voudrai spas

    Enfin, après ce que tu viens de me dire sur le scheduler et les scripts perl, j'ai un peu peur.

    C'est pour ça que je voulais me tourner vers les services et avoir des infos sur la manière de le réaliser ...
    tout le monde est d'accord pour critiquer la pensée unique

  4. #4
    Expert confirmé
    Avatar de GLDavid
    Homme Profil pro
    Service Delivery Manager
    Inscrit en
    Janvier 2003
    Messages
    2 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Service Delivery Manager
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Janvier 2003
    Messages : 2 859
    Points : 4 801
    Points
    4 801
    Par défaut
    A titre indicatif, tu as aussi pycron pour Windows. C'est ni plus ni moins que cron

    @++
    GLDavid
    Consultez la FAQ Perl ainsi que mes cours de Perl.
    N'oubliez pas les balises code ni le tag

    Je ne répond à aucune question technique par MP.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut
    Salut GLDavid,
    Merci beaucoup, j'ai installé pycron et pycron logviewer, converti mon perl en exe à l'aide de perl2exe et paramètrer le scheduler crontab.
    ça marche à merveille, comme un service en fait (même si c'ets pycron qui est en service).

    Par contre, juste avant de mettr ele tag résolu, je voudrai savoir une chose, un petit souci qui subsiste
    Pour le test, j'ai fait en sorte que le script s'éxécute toutes les minutes.
    Toutes les minutes donc, le script s'éxécute mais j'ai une fenêtre dos qui apparaît, puis disparaît à la fin de l'éxécution.
    Coment faire pour ne pas voir apparaître cette fenêtre ... ???? C'est possible ???

    Merci pour vos réponses.
    tout le monde est d'accord pour critiquer la pensée unique

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut
    Finalement, j'ai trouvé, le module perl2exe dans sa version complète permet de ne pas afficher la console.
    tout le monde est d'accord pour critiquer la pensée unique

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

Discussions similaires

  1. [AJAX] faire tourner un script php en boucle avec ajax
    Par mitmit dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 05/05/2007, 10h33
  2. faire tourner un script à une heure donnée
    Par nebil dans le forum Langage
    Réponses: 2
    Dernier message: 03/07/2006, 12h30
  3. [EasyPHP] Faire tourner des scripts PHP en cgi
    Par Jim_Nastiq dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 19/04/2006, 10h45
  4. Réponses: 2
    Dernier message: 11/07/2002, 08h31

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