Note that the pattern eval { ... }; if ($@) { ... } suffers from issues, and this pattern is better: eval { ...; 1 } or { ... }; - or just use a module like Try::Tiny.
Other than the scoping issue of @file_list that hippo pointed out, I'm not sure I understand what problems you're having. I tried the following code on Linux and it times out the ls just fine:
use warnings; use strict; use Data::Dumper; my @file_list; eval { local $SIG{ALRM} = sub { die "alarm\n" }; alarm 5; chomp( @file_list = `sleep 10; ls /tmp` ); die "ls: \$?=$?" if $?; alarm 0; 1 } or do { die $@ unless $@ eq "alarm\n"; warn "Timed out"; }; print Dumper(\@file_list);
Also, have a look at IPC::Run, it has timeout support, and support for several more powerful features. Here's an example that also shows Try::Tiny:
use warnings; use strict; use Data::Dumper; use IPC::Run qw/ run timeout /; use Try::Tiny; my @file_list; try { run ['ls','/tmp'], \undef, \my $lines, timeout(5) or die "ls: \$?=$?"; @file_list = split /\n/, $lines; } catch { die $_ unless /^IPC::Run: timeout/; warn "Timed out"; }; print Dumper(\@file_list);
In reply to Re: how to stop command
by haukex
in thread how to stop command
by dideod.yang
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |