open TRACEROUTE, 'traceroute -xyz --whatever|' or die "Pipe failed: $!\n"; { local $SIG{ ALRM } = sub { die "timeout" }; eval { alarm ALARM_INTERVAL; while () { # apply your quit test } alarm 0; }; if ( $@ && $@ !~ /timeout/ ) { alarm 0; die $@; } } close TRACEROUTE;