On 10/15/05, zentara <[EMAIL PROTECTED]> wrote: > On Sat, 15 Oct 2005 08:56:36 +0700, [EMAIL PROTECTED] (Beast) wrote: > > > > >Hello, > > > >My perl script requires to invoke external program, however this > >external program sometimes take forever to complete. The external > >program accessing /dev/ircomm0 and whenever the IR client was hang or > >out of range, this program try to search forever making the calling > >program seems to hang. > >Unfortunately, perl needs to be run unatended, scheduled using cron. > > > >My question is, how do I add a timer, so whenever external script did > >not return results after x seconds just abort the program. > > > >snippet: > > > >---- > >my @results = `$sms_bin $options --msg="@sms_msg" > >--number="$rcpt_number" 2>&1`; > >--- > > Search google and groups.google for "perl alarm". > > #!/usr/bin/perl > use warnings; > use strict; > > foreach my $script (@scripts) { > eval { > alarm(360); # set time limit to 6 mins > system($script); > alarm(0); # if $script finishes in <6min reset alarm > } > if ($@) { > # do stuff if eval fails (eg timeout) > } >
Maybe. But you can't bank on alarm DTRT with setting $! with system() on it's own, and you want to know whether eval fails becuase of the timeout or something else. See perldoc -f alarm for details. It's better to trap SIGALRM when using alarm for external cals: my $timeout = 60; my $time; eval { local $SIG{ALRM} = sub { die "timeout!" }; alarm $timeout; system($script); $time = alarm 0; } if ($@) { if ($@ =~ /timeout/) { #do something } else { #do something else for other failures } } else { print "External call finished in ".($timeout - $time)." seconds\n"; } HTH, -- jay -------------------------------------------------- This email and attachment(s): [ ] blogable; [ x ] ask first; [ ] private and confidential daggerquill [at] gmail [dot] com http://www.tuaw.com http://www.dpguru.com http://www.engatiki.org values of β will give rise to dom!