Regarding the part of your comment regarding PIDs, I believe you can kill 0, $pid to determine if a signal can be sent to that PID. If so, then verify that the PID is for a process executing the same script/program (by parsing the result of a 'ps' command, or using a module such as Proc::ProcessTable).
# Untested
use Proc::ProcessTable;
my $tobj = new Proc::ProcessTable;
my $proctable = $tobj->table();
my $pid = 0;
for ( @$proctable ) {
if ( $_->cmndline =~ m/$script_name/ ) {
$pid = $_->pid;
last;
}
}
print $script_name,
( kill 0, $pid ? q{appears} : q{does not appear} ),
q{ to be running}, qq{\n};
Hope that helps.