eval { local $SIG{ALRM} = sub { die "too long\n" }; alarm 30; #seconds system( '/usr/local/bin/scp', 'me@example.com:foo.txt', '.' ); alarm 0; }; if ($@ eq "too long\n") { # time out } elsif ($@) { #something else went wrong } else { # ok }