Win32::ServiceManager - Manage Windows Services |
Win32::ServiceManager - Manage Windows Services
version 0.002003
use Win32::ServiceManager; use Path::Class 'file';
my $dir = file(__FILE__)->parent->absolute; my $sc = Win32::ServiceManager->new( nssm_path => $dir->file(qw( cgi exe nssm.exe ))->stringify, );
$sc->create_service( name => 'LynxWebServer01', display => 'Lynx Web Server 1', description => 'Handles Web Requests on port 3001', command => $dir->file(qw( App script server.pl ))->stringify . ' -p 3001', ); $sc->start_service('LynxWebServer01', { non_blocking => 0 }); $sc->stop_service('LynxWebServer01'); $sc->delete_service('LynxWebServer01');
$sc->create_service( name => 'GRWeb1', display => 'Giant Robot Web Worker 1', description => 'Handles Giant Robot Web Requests on port 3001', use_perl => 1, use_nssm => 1, command => 'C:\code\GR\script\server.pl -p 3001', depends => [qw(MSSQL Apache2.4)], );
Takes a hash of the following arguments:
name
sc start
etc.)
use_nssm
use_perl
$^X
. If for some reason you want to use a different perl you
will have to set use_perl
to false.
display
description
check_command
command
args
depends
idempotent
Note: there are many options that sc
can use to create and modify services.
I have taken the few that we use in my project and forced the rest upon you,
gentle user. For example, whether you like it or not these services will
restart on failure and start automatically on boot. I am completely willing to
add more options, but in 4 distinct projects we have never needed more than the
above. Patches Welcome!
$sc->start_service('GRWeb1', { non_blocking => 1 });
Starts a service with the passed name. The second argument is an optional hashref with the following options:
non_blocking
idempotent
$sc->stop_service('GRWeb1', { non_blocking => 1 });
Stops a service with the passed name. The second argument is an optional hashref with the following options:
non_blocking
idempotent
$sc->restart_service('GRWeb1', { non_blocking => 1 });
Stops and starts a service with the passed name. The second argument is an optional hashref with the following options:
non_blocking
idempotent
$sc->start_service('GRWeb1') unless $sc->get_status('GRWeb1')->{current_state} eq 'running';
Returns the status info about the specified service. The status info is a hash containing the following keys:
Note that for reasons unknown to me the underlying win32 GetStatus
call fails
when restarting services, so I added a retry counter. If you are interested in
finding out when and how seriously your services fail the count, turn on
warnings.
current_state
Note that there is much more information that could be included in
get_status
, but I've only needed the current_state
so far. If you need
something else I will gladly add more information to the returned hash, or
better yet, send a patch.
my $services = $sc->get_services; say "$_ is installed!" for keys %$services;
Returns a hashref of services. Keys are the display name, values are the real name.
$sc->delete_service('GRWeb1', { idempotent => 0 });
Deletes a service
autostop
$sc->delete_service(GRWeb1 => { autostop => { non_blocking => 0 } });
as that should ensure that the service is truly gone after the code runs.
idempotent
The default value of check_command
for the create_service method.
Default is true.
The default value of use_nssm
for the create_service method.
The default value of use_perl
for the create_service method.
Set this to true (default) to idempotently start, stop, delete, and create services.
Set this to true (default) to asyncronously to start or stop services. Sometimes blocking is better as it allows for restarts, for example.
Set this to the path to nssm (default is just nssm_64.exe
, or nssm_32.exe
if you set nssm_bits to 32).
nssm comes in both 32 and 64 bit flavors. This specifies when of the
bundled nssm
binaries to use. (default is 64)
Set this to true to get warnings for non-serious failures. Currently the only such warning is in get_status.
nssm is a handy service wrapper for Windows. Instead of
adding hooks directly to your program to handly Windows service signals, this
program runs your program for you and intercepts the signals and acts
appropriately. It is open source and clocks in at less than two megabytes of
RAM. The code is at git://git.nssm.cc/nssm/nssm.git
.
The best way to use this module is to subclass it for your software. So for example we have a subclass that looks something like the following:
package Lynx::ServiceManager
use Moo; extends 'Win32::ServiceManager';
our $DIR = file(__FILE__)->parent->absolute; sub create_catalyst_service { my ($self, $i) = @_;
$self->create_service( name => "LynxWebServer$i", display => "Lynx Web Server $i", description => 'Handles Web Requests on port 3001', command => $dir->file(qw( App script server.pl ))->stringify . " -p 300$i", );
}
sub start_catalyst_service { $_[0]->start_service("LynxWebServer$_[1]", $_[2]) }
...
The above makes it very easy for use to start, stop, add, and remove catalyst services.
I have used this at work and am confident in it, but it has only been used on Windows Server 2008. The tests can do no better than ensure the generated strings are as expected, instead of ensuring that a service was correctly created or started or whatever.
Additionally, in my own work when I get an error from sc
I just report it
and move forward. Because of this I have done very little to make exceptions
useful. I am open to making them objects but again, I do not need that myself,
so Patches Welcome!
Arthur Axel ``fREW'' Schmidt <frioux+cpan@gmail.com>
This software is copyright (c) 2014 by Arthur Axel ``fREW'' Schmidt.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.
Win32::ServiceManager - Manage Windows Services |