#//////////////////////////////////////////////////////////////////////////////
#//
#// Daemon_Template.pl
#// Win32::Daemon Perl extension template script
#//
#// Copyright (c) 1998-2008 Dave Roth
#// Courtesy of Roth Consulting
#// http://www.roth.net/
#//
#// This file may be copied or modified only under the terms of either
#// the Artistic License or the GNU General Public License, which may
#// be found in the Perl 5.0 source kit.
#//
#// 2008.03.24 :Date
#// 20080324 :Version
#//////////////////////////////////////////////////////////////////////////////
use Win32::Daemon;
my $SLEEP_TIMEOUT = 1000; # This value is in milliseconds
my $START_TIME = time();
my ( $DB_DIR, $DB_FILE_NAME ) = ( Win32::GetFullPathName( $0 ) =~ /^(.*)\\([^\\]*)$/ );
$DB_FILE_NAME =~ s/\..*?$/.log/;
my $LogFile = "$DB_DIR\\$DB_FILE_NAME";
# You could log to a named pipe, very cool!
#$LogFile = "\\\\.\\pipe\\syslog";
if( open( LOG, ">$LogFile" ) )
{
my $StartTime = localtime( $START_TIME );
my $BackupHandle = select( LOG );
$| = 1;
select( $BackupHandle );
print LOG << "EOT"
# Service Starting
# Script: $0
# PID: $$
# Date: $StartTime
EOT
}
Log( "Starting service" );
Win32::Daemon::StartService();
Log( "Entering service loop" );
$LastState = SERVICE_STOPPED;
while( SERVICE_STOPPED != ( $State = Win32::Daemon::State() ) )
{
Log( "State: $State" );
if( SERVICE_START_PENDING == $State )
{
# Initialization code
$LastState = SERVICE_RUNNING;
# Win32::Daemon::State( { state => SERVICE_RUNNING, error => NO_ERROR } );
Win32::Daemon::State( SERVICE_RUNNING );
Log( "Service initialized. Setting state to Running." );
}
elsif( SERVICE_PAUSE_PENDING == $State )
{
$LastState = SERVICE_PAUSED;
Win32::Daemon::State( SERVICE_PAUSED );
Log( "Pausing." );
next;
}
elsif( SERVICE_CONTINUE_PENDING == $State )
{
$LastState = SERVICE_RUNNING;
Win32::Daemon::State( SERVICE_RUNNING );
Log( "Resuming from paused state." );
next;
}
elsif( SERVICE_STOP_PENDING == $State )
{
$LastState = SERVICE_STOPPED;
Win32::Daemon::State( { state => SERVICE_STOPPED, error => 1234 } );
Log( "Stopping service." );
next;
}
else
{
# Take care of unhandled states by setting the State()
# to whatever the last state was we set...
Win32::Daemon::State( $LastState );
}
Win32::Sleep( $SLEEP_TIMEOUT );
}
Log( "Stopping the service..." );
print Win32::Daemon::StopService();
Log( "Stopped." );
close( LOG ) if( fileno( LOG ) );
sub Log
{
my( $Message ) = @_;
if( fileno( LOG ) )
{
print LOG "[" . localtime() . "] $Message\n";
}
}