http://qs321.pair.com?node_id=314605

Dru has asked for the wisdom of the Perl Monks concerning the following question:

Hello Monks,

I'm trying to monitor a service on Win2k and I wrote the following script based on this node Simple WIN32 Service Test.

No matter what I do, I can't get the service to stop. I'm using PGPService just for testing. I'm actually going to be monitoring PCAnywhere's service. Anyway, does anyone know why this is not working?
use strict; use warnings; use Win32::Service; #set up a hash of known service states my %statcodeHash = ( '1' => 'stopped.', '2' => 'start pending.', '3' => 'stop pending.', '4' => 'running.', '5' => 'continue pending.', '6' => 'pause pending.', '7' => 'paused.' ); my (%serviceHash,%statusHash); my ($key,$svc); #go get 'em... Win32::Service::GetServices("", \%serviceHash); foreach $key(keys %serviceHash){ my %statusHash; if ($serviceHash{"$key"} eq 'PGPService'){ $svc = $serviceHash{"$key"}; } } Win32::Service::GetStatus("", $svc, \%statusHash); #if ($statusHash{"CurrentState"} =~ /4/){ Win32::Service::StopService('', $svc); #} print "$svc" . " is currently " . $statcodeHash{$statusHash{"CurrentSt +ate"}} . "\n";
Which keeps producing  PGPService is currently running.

Thanks,
Dru

Replies are listed 'Best First'.
Re: Help with Win32::Service
by AcidHawk (Vicar) on Dec 14, 2003 at 06:22 UTC

    Your script does stop the service. However, you only do Win32::Service::GetStatus("", $svc, \%statusHash); once before you try to stop the service and then after you stop the service you don't ask for the status again. So actually you need something like this.

    ... Win32::Service::GetStatus("", $svc, \%statusHash); #if ($statusHash{"CurrentState"} =~ /4/){ print "$svc" . " is currently " . $statcodeHash{$statusHash{"CurrentSt +ate"}} . "\n"; #} if (Win32::Service::StopService('', $svc)) { sleep (3); Win32::Service::GetStatus("", $svc, \%statusHash); print "$svc" . " is currently " . $statcodeHash{$statusHash{"Curre +ntState"}} . "\n"; } else { print "Error ... $^E\n"; }
    I have to wait at least 3 seconds before I can check the current status of the service before I can see that the status has changed.

    -----
    Of all the things I've lost in my life, its my mind I miss the most.
Re: Help with Win32::Service
by BrowserUk (Patriarch) on Dec 14, 2003 at 04:22 UTC

    Try modifying your script to test the return codes from the calls. In particular

    Win32::Service::StopService('', $svc) or warn "Couldn't stop $svc because $^E";

    There are several possibilities why the call could be failing, but easier that speculating on them is to find out why the system thinks it couldn't do this for you.


    Examine what is said, not who speaks.
    "Efficiency is intelligent laziness." -David Dunham
    "Think for yourself!" - Abigail
    Hooray!