Précédent   Forum du club des développeurs et IT Pro > Autres langages > Perl > Modules
Modules Toutes vos questions sur l'utilisation, l'installation, la création de modules Perl sous Windows/Linux/Unix/MacOS. Avant de poster, veuillez consulter les FAQs perl, les cours Perl et les sources Perl.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 02/08/2012, 19h22   #1
Krys006
Invité régulier
 
Inscription : novembre 2007
Messages : 49
Détails du profil
Informations forums :
Inscription : novembre 2007
Messages : 49
Points : 9
Points : 9
Par défaut Mise en oeuvre du module Win32::Daemon

Bonjour,

Je souhaite faire fonctionner un script perl comme service Windows. Je suis sous XP Pro SP2.
J'ai réalisé plusieurs essais infructueux. Finalement, j'essaie de mettre en œuvre le squelette de script présenté à l'exemple 4 de la doc du CPAN, utilisant une Callback routine, visible ici : http://search.cpan.org/~jdb/Win32-Da...0117/Daemon.pm

Est-ce que quelqu'un pourrait me montrer un exemple de code à écrire dans la partie réservée au travail que doit effectuer le service ?

Le script d'installation associé semble bien fonctionner, puisque les clés nécessaires sont bien ajoutées dans la base de registre, et le nouveau service apparaît bien dans le gestionnaire des services de windows.

Cependant, je ne parviens pas à le démarrer, il se bloque à l'état de "Démarrage". Du coup, pour l'arrêter, je dois redémarrer (le PC).

Merci de bien vouloir m'expliquer quel type de code il faut mettre ici. Est-ce une boucle infinie du type while(1 == 1) { .... }. Un petit exemple d'écriture dans un fichier toutes les 5 s par exemple me suffirait. A moins que le problème de démarrage n'ait rien à voir avec cette partie ?

Merci d'avance.


Code du script d'installation :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# Service_Win32_2_install.pl
use Win32::Daemon;
my $ServicePath = $^X; 
my $ServiceParams = '"C:\Essai_scripts\Service_Win32_2.pl"';
 
my %Hash = ( machine =>  '',
             name    =>  'PerlWin32_2',
             display =>  'PerlWin32_2 Service',
             path    =>  $ServicePath,
             user    =>  '',
             pwd     =>  '',
             description => 'Script perl service Win32',
             parameters => $ServiceParams
           );
 
if( Win32::Daemon::CreateService( \%Hash ) ) {
        print "Successfully added.\n";
}
else {
  print "Failed to add service: " . Win32::FormatMessage( Win32::Daemon::GetLastError() ) . "\n";
}
Code du script service :
Code :
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
# Service_Win32_2.pl
use Win32::Daemon;
Win32::Daemon::RegisterCallbacks( \&CallbackRoutine );
 %Context = ( count   =>  0,
              start_time => time(),
            );
# Start the service passing in a context and indicating to callback using the "Running" event every 2000 milliseconds (2 seconds).
Win32::Daemon::StartService( \%Context, 2000 );
 
sub CallbackRoutine {
  my( $Event, $Context ) = @_;
 
  $Context->{last_event} = $Event;
  if( SERVICE_RUNNING == $Event )
  {
    # ... process your main stuff here... note that here there is no need to change the state
    #====================================================
    # QUE PEUT-ON ECRIRE ICI ?
    #====================================================
 
  }    
  elsif( SERVICE_START_PENDING == $Event )
  {
    # Initialization code... do whatever you need to do to start...
 
    $Context->{last_state} = SERVICE_RUNNING;
    Win32::Daemon::State( SERVICE_RUNNING );
  }
  elsif( SERVICE_PAUSE_PENDING == $Event )
  {
    $Context->{last_state} = SERVICE_PAUSED;
    Win32::Daemon::State( SERVICE_PAUSED );
 
  }
  elsif( SERVICE_CONTINUE_PENDING == $Event )
  {
    $Context->{last_state} = SERVICE_RUNNING;
    Win32::Daemon::State( SERVICE_RUNNING );
  }
  elsif( SERVICE_STOP_PENDING == $Event )
  {
    $Context->{last_state} = SERVICE_STOPPED;
    Win32::Daemon::State( SERVICE_STOPPED );
 
    # We need to notify the Daemon that we want to stop callbacks and the service.
    Win32::Daemon::StopService();
  }
  else
  {
    # Take care of unhandled states by setting the State()
    # to whatever the last state was we set...
    Win32::Daemon::State( $Context->{last_state} );
  }
  return();
}
Krys006 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 05h27.


 
 
 
 
Partenaires

Hébergement Web