#!/usr/bin/perl -w use strict; use POSIX qw(:errno_h); use POSIX qw(:sys_wait_h); $SIG{CHLD} = "IGNORE"; my ($child, $script, $cleanup, $time); &create_child; sleep($time); &reaper; sub create_child { unless($child = fork()) { die "Cannot fork: $!" unless defined $child; exec($script); } $child++; } # Some values are from get_args sub not shown sub reaper { if(kill 0 => $child) { print "Child timed out, sending signal 15\n"; kill 15, $child; exec($cleanup); } elsif ($! == EPERM) { print "Child has changed its UID\n"; } elsif ($! == ESRCH) { print "Child is already dead\n"; } else { warn "Could not check child's PID: $!\n"; } }