Tue Dec 10 07:18:45 2013: Request 91296 was acted upon. Transaction: Ticket created by lewis.t...@gmail.com Queue: Win32-Daemon Subject: Win32::Daemon not handling shutdown Broken in: (no value) Severity: (no value) Owner: Nobody Requestors: lewis.t...@gmail.com Status: new Ticket <URL: https://rt.cpan.org/Ticket/Display.html?id=91296 >
Hi I am using Win2k8R2 Ent SP1 64bit Using Strawberry Perl (64-bit) 5.18.1.1-64bit and Win32::Daemon 20131206. I have a program that needs to tidy things up on system shutdown. I have tried all sorts but system shutdown does not seem to trigger anything - not stop nor shutdown. Below is my snippet of code, please advise if it is a bug or something i need to do. use strict; use Win32::Daemon; my $accepted_controls = Win32::Daemon::AcceptedControls(); $accepted_controls &= ~SERVICE_ACCEPT_PAUSE_CONTINUE; # can't handle pause/resume $accepted_controls |= SERVICE_ACCEPT_SHUTDOWN; # make sure we catch OS shutdowns Win32::Daemon::AcceptedControls($accepted_controls); Win32::Daemon::RegisterCallbacks( { start => \&Callback_Start, running => \&Callback_Running, stop => \&Callback_Stop, #pause => \&Callback_Pause, #continue => \&Callback_Continue, shutdown => \&Callback_Shutdown, } ); my %Context = ( last_state => SERVICE_STOPPED, 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 Callback_Running { my( $Event, $Context ) = @_; # Note that here you want to check that the state # is indeed SERVICE_RUNNING. Even though the Running # callback is called it could have done so before # calling the "Start" callback. if( SERVICE_RUNNING == Win32::Daemon::State() ) { # ... process your main stuff here... # ... note that here there is no need to # change the state } } sub Callback_Start { my( $Event, $Context ) = @_; # Initialization code # ...do whatever you need to do to start... system("cmd/c echo starting >>c:/temp/abc.txt"); $Context->{last_state} = SERVICE_RUNNING; Win32::Daemon::State( SERVICE_RUNNING ); } sub Callback_Pause { my( $Event, $Context ) = @_; $Context->{last_state} = SERVICE_PAUSED; Win32::Daemon::State( SERVICE_PAUSED ); } sub Callback_Continue { my( $Event, $Context ) = @_; $Context->{last_state} = SERVICE_RUNNING; Win32::Daemon::State( SERVICE_RUNNING ); } sub Callback_Stop { my( $Event, $Context ) = @_; system("cmd/c echo stopping >>c:/temp/abc.txt"); $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(); } sub Callback_Shutdown { my( $Event, $Context ) = @_; # don't know how lont it takes to shutdown RDS # tell Service Control Manager to wait $Context->{last_state} = SERVICE_STOP_PENDING; Win32::Daemon::State( SERVICE_STOP_PENDING, 30000 ); system("cmd/c shutting down >>c:/temp/abc.txt"); $Context->{last_state} = SERVICE_STOPPED; Win32::Daemon::State( SERVICE_STOPPED ); }