2012年1月30日星期一

Perl Timeout | 陈钢的博客

Timeout | 陈钢的博客

【 Perl 】给所有的shell程序全加上timeout参数

2011年3月15日
有些程序自带–timeout参数,比如rsync,这样很好。
但是有些程序就很不乖,比如ffmpeg,自己不会超时退出,这很不好。
让我们用Perl把所有的命令都加上超时退出的功能——
01#! /usr/bin/env perl
02use POSIX qw(strftime WNOHANG);
03
04#check input
05my $timeout = shift @ARGV;
06my ($secs) = $timeout =~ /--timeout=(\d+)$/;
07unless($secs)
08{
09    print "Usage: ./timeout --timeout=[SECONDS] [COMMAND] \n";
10    exit -1;
11}
12
13#fork and exec
14my $status = 0;
15$SIG{CHLD} = sub { while(waitpid(-1,WNOHANG)>0){ $status = -1 unless $? == 0; exit $status;} };
16$0 = 'timeout hacked ' . $ARGV[0];
17defined (my $child = fork);
18if($child == 0)
19{
20    my $cmd = join ' ', @ARGV;
21    exec($cmd);
22}
23$SIG{TERM} = sub { kill TERM => $child };
24$SIG{INT} = sub { kill INT => $child };
25
26#kill when timeout
27sleep $secs;
28$status = -1;
29kill TERM => $child;
30sleep 1 and kill INT => $child if kill 0 => $child;
31sleep 1 and kill KILL => $child if kill 0 => $child;
32exit $status;

然后如下就可以让任意的命令超时退出了(这里执行的命令是“sleep 500”)——
./timeout.pl --timeout=3 sleep 500 

【 Perl 】如何简单控制perl脚本超时

2009年11月3日
1eval
2{
3    local $SIG{ALRM} = sub { die "alarmn" };
4    alarm $config{'perl'}{'time_out'};
5    do $plugin;
6    alarm 0;
7};

没有评论: