So, how can I kill Bill?!?
The script is as simple as the following:
#!/usr/bin/perl use strict; my $self; # Maximum execution time (in sec) of the child process. When that timer expires, we send a kill command to the child process my $MAX_EXEC_TIME = 10; eval { # When the alarm interrupt is triggered, send the timed out\n message to the die function local $SIG{'ALRM'} = sub { die "timed out\n" }; # Set ALARM to interrupt after MAX_EXEC_TIME seconds alarm($MAX_EXEC_TIME); print "Starting process bill.pl\n"; # Start child process in asynch mode and get the child process id $self->{PID} = system 1, "perl bill.pl"; print "Child Pid = $self->{PID}\n"; # Wait for the child to terminate. If it ends before the ALARM is triggered, the process continues from *SECTION1* waitpid $self->{PID}, 0; }; if ($@) { if ($@ eq "timed out\n") { # *SECTION2* The child process didn't return within the MAX_EXEC_TIME, let's kill it print "I timed out and killed pid $self->{PID}\n"; if ($self->{PID}) { # Send a SIGTERM message to let the process try to exit cleanly kill(15,$self->{PID}); } $self->{PID} = undef; } else { print "something else happened: $@\n"; } } else { # *SECTION1* The child process terminated before the ALARM interrupt was triggered print "Child process terminated as expected. I can keep going...\n"; }
...and our Bill process is a simple infinite loop:
#!/usr/bin/perl while(1) { print "alive\n"; sleep(2); }
No comments:
Post a Comment