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();
}