App-Daemon
view release on metacpan or search on metacpan
print "Name match: ", scalar @cmdlines, "\n";
for(@cmdlines) {
print " ", $_, "\n";
}
}
return $exit_code;
}
###########################################
sub process_running {
###########################################
my($pid) = @_;
my $rc = kill( 0, $pid );
if( $rc ) {
# pseudo signal got delivered, process exists
return 1;
} elsif( $! == ESRCH ) {
# process doesn't exist
return 0;
} elsif( $! == EPERM ) {
# process does exist, but we don't have permission to
# send the signal
return 1;
}
# Weirdness ensued.
return 0;
}
###########################################
sub processes_running_by_name {
###########################################
my($name) = @_;
require Proc::ProcessTable;
$name = basename($name);
my @procs = ();
my $t = Proc::ProcessTable->new();
foreach my $p ( @{$t->table} ){
if($p->cmndline() =~ /\b\Q${name}\E\b/) {
next if $p->pid() == $$;
DEBUG "Match: ", $p->cmndline();
push @procs, $p->cmndline();
}
}
return @procs;
}
###########################################
sub appname {
###########################################
my $appname = basename($0);
# Make sure -T regards it as untainted now
($appname) = ($appname =~ /([\w-]+)/);
return $appname;
}
###########################################
sub find_option {
###########################################
my($opt, $has_arg) = @_;
my $idx = 0;
for my $argv (@ARGV) {
if($argv eq $opt) {
if( $has_arg ) {
my @args = splice @ARGV, $idx, 2;
return $args[1];
} else {
return splice @ARGV, $idx, 1;
}
}
$idx++;
}
return undef;
}
###########################################
sub def_or {
###########################################
if(! defined $_[0]) {
$_[0] = $_[1];
}
}
###########################################
sub pid_file_write {
###########################################
my($pid) = @_;
sysopen FILE, $pidfile, O_RDWR|O_CREAT, 0644 or
LOGDIE "Cannot open pidfile $pidfile";
flock FILE, LOCK_EX;
seek(FILE, 0, 0);
print FILE "$pid\n";
close FILE;
}
###########################################
sub pid_file_read {
###########################################
open FILE, "<$pidfile" or LOGDIE "Cannot open pidfile $pidfile";
flock FILE, LOCK_SH;
my $pid = <FILE>;
chomp $pid if defined $pid;
close FILE;
$pid =~ /^(\d+)$/; # Untaint
return $1;
}
###########################################
sub pid_file_process_running {
###########################################
if(! -f $pidfile) {
return undef;
}
my $pid = pid_file_read();
if(! $pid) {
return undef;
}
if(process_running($pid)) {
return $pid;
}
return undef;
}
###########################################
sub proc_processtable_available {
###########################################
my $module = "Proc::ProcessTable";
eval "require $module;";
if( $@ ) {
return 0;
}
return 1;
}
1;
__END__
=head1 NAME
App::Daemon - Start an Application as a Daemon
=head1 SYNOPSIS
# Program:
use App::Daemon qw( daemonize );
daemonize();
do_something_useful(); # your application
# Then, in the shell: start application,
# which returns immediately, but continues
# to run do_something_useful() in the background
$ app start
$
# stop application
$ app stop
# start app in foreground (for testing)
$ app -X
( run in 0.737 second using v1.01-cache-2.11-cpan-2398b32b56e )