#!/usr/bin/env perl use strict; use warnings; use POSIX qw/:sys_wait_h/; my $child_pid = undef; my $status = fork; die "failed to fork\n" unless defined $status; if ($status > 0) { # this is the parent process. local $SIG{ALRM} = sub { print STDERR "operation timed out for PID $status\n"; kill 9, $status }; alarm 10; my $pid = 0; do { $pid = POSIX::waitpid ($status, POSIX::WNOHANG); } until ($pid > 0); alarm 0; } else { # this is the child process. system "ssh a_server_could_hang"; }