This can be done using Fork and Exec Combination as said by Larry Wall:
FORK: {
if ($pid=fork) { # assign result of fork to $pid,
# see if it is non-zero.
# Parent process here
# Child pid is in $pid
print "child pid : $pid\n";
sleep $delay;
backup_log();
if(kill 0 => $pid) {#kill 0 checks whether a process is alive or not
push @pids,$pid; #Collect child pids who exceeded time limit or alive after delay
}
foreach my $pid (@pids) {
kill 9,$pid;
Debug("killing child script process $pid");
Debug("child script process $pid exited with RC=32;$RCDesc{32}");
}
Debug("Ending gsma_wrapper");
Debug("---------------------");
exit(0);
} elsif (defined($pid)) {
# Child process here
# parent process pid is available with getppid
my $ppid = getppid();
print "parent pid : $ppid\n";
# exec will transfer control to the child process, and will
# finish (exit) when the scirpt is done.
my $cmd = "sh $action_script";
Debug("executing action_script $cmd");
exec("$cmd 1>./stdout 2>./stderr") or log_exit("Action script $action_script failed with RC=10;$RCDesc{10}");
Debug("$RCDesc{0}");
} elsif ($! == EAGAIN) {
# EAGAIN is the supposedly recoverable fork error
sleep 5;
redo FORK;
} else {
#weird fork error
Debug("Can't fork action script $action_script: $!");
}
}
# wait for the action scrpt to complete and return status (like system does)
waitpid($pid,0);
$status = $?;
No comments:
Post a Comment