App-Control
view release on metacpan or search on metacpan
my $self = bless \%args, $class;
die "No EXEC specified\n" unless $self->{EXEC};
die "$self->{EXEC} doesn't exist\n" unless -e $self->{EXEC};
die "$self->{EXEC} is not executable\n" unless -x $self->{EXEC};
die "No PIDFILE specified\n" unless $self->{PIDFILE};
my $piddir = dirname( $self->{PIDFILE} );
die "Can't work out directory from path $self->{PIDFILE}\n"
unless $piddir
;
unless ( -d $piddir )
{
warn "Creating $piddir ...\n" if $self->{VERBOSE};
mkpath( $piddir ) or die "Can't create path $piddir\n";
}
unless ( -w $piddir )
{
die "can't create $self->{PIDFILE}\n";
}
if ( -e $self->{PIDFILE} )
{
die "$self->{PIDFILE} is not readable\n"
unless -r $self->{PIDFILE}
;
die "$self->{PIDFILE} is not writeable\n"
unless -w $self->{PIDFILE}
;
}
if ( defined $self->{ARGS} )
{
die "ARGS should be an ARRAY ref\n"
unless ref( $self->{ARGS} ) eq 'ARRAY'
;
}
$self->{SLEEP} = 1 unless defined $self->{SLEEP};
$self->{ARGS} ||= [];
return $self;
}
sub running()
{
my $self = shift;
my $pid = $self->pid;
return defined( $pid ) ? kill( 0, $self->{PID} ) : 0;
}
sub pid()
{
my $self = shift;
return unless -e $self->{PIDFILE};
die "Can't read $self->{PIDFILE}\n" unless -r $self->{PIDFILE};
open( PID, $self->{PIDFILE} )
or die "Can't open pid file $self->{PIDFILE}\n"
;
my $pid = <PID>;
close( PID );
return undef unless defined $pid;
chomp( $pid );
return undef unless $pid;
die "$pid looks like a funny pid!\n"
unless $pid =~ /^(\d+)$/
;
return $self->{PID} = $1;
}
sub cmd()
{
my $self = shift;
my $cmd = shift;
return if
defined $self->{IGNOREFILE} and
-e $self->{IGNOREFILE}
;
unless ( defined $cmd )
{
die "CMD should be <start|stop|restart|status|hup>\n";
}
if ( $cmd eq 'status' )
{
return
"$self->{EXEC} (",
( $self->pid ? $self->pid : "no pidfile $self->{PIDFILE}" ),
") is ",
( $self->running ? '' : 'not ' ),
"running\n"
;
}
elsif ( $cmd eq 'start' )
{
die $self->status if $self->running;
my $child = fork;
if ( $child )
{
$SIG{CHLD} = 'IGNORE';
warn "$self->{EXEC} @{$self->{ARGS}} ($child) started\n"
if $self->{VERBOSE}
;
if ( $self->{CREATE_PIDFILE} )
{
warn "Creating $self->{PIDFILE} ...\n" if $self->{VERBOSE};
open( FH, ">$self->{PIDFILE}" )
or die "Can't write to $self->{PIDFILE}"
;
print FH "$child\n";
close( FH );
}
my $loop = 0;
while( not $self->running )
{
warn $self->status if $self->{VERBOSE};
sleep( $self->{SLEEP} );
warn "is $self->{EXEC} ruinning (${loop}'th time)?\n"
if $self->{VERBOSE} and $loop
;
if ( defined $self->{LOOP} and $loop++ == $self->{LOOP} )
{
warn "Failed to start $self->{EXEC}\n"
if $self->{VERBOSE}
;
( run in 1.622 second using v1.01-cache-2.11-cpan-39bf76dae61 )