http://www.perlmonks.org?node_id=999385


in reply to Re^2: perl alarms not working as expected
in thread perl alarms not working as expected

The signal handler is that sub{} that you stored in $SIG{ALRM}.

To kill the other script, you'd have to get its pid. Unfortunately I don't know any way to this without any ugly hacks. Maybe someone else does.

So for instance, you can use this temporary file handle hack:

#!/usr/bin/perl use strict; use warnings; use CGI; use File::Temp; my $q = new CGI; print $q->header; my $tmp = File::Temp->new(UNLINK => 0); my $tmpnam = $tmp->filename; eval { local %SIG; $SIG{ALRM}= sub{ $tmp->close; system("fuser", "-sk", "-TERM", $tmpnam); unlink $tmpnam; die "timeout reached, after 20 seconds!\n"; }; alarm 3; #sleep (60); system("sleep 10 3>$tmpnam"); alarm 0; }; alarm 0; if($@) { print "Error: $@\n"; } exit(0);

This requires the "fuser" command, which is shipped with most Linux distros.

If this does not make the other script die, then leave out the "-TERM".

I replaced the name of your shell script with "sleep 10", otherwise I can't test it. I also replaced 20 with 3 because I did not want to wait 20 seconds.