【 Perl 】给所有的shell程序全加上timeout参数
有些程序自带–timeout参数,比如rsync,这样很好。
但是有些程序就很不乖,比如ffmpeg,自己不会超时退出,这很不好。
让我们用Perl把所有的命令都加上超时退出的功能——
然后如下就可以让任意的命令超时退出了(这里执行的命令是“sleep 500”)——
但是有些程序就很不乖,比如ffmpeg,自己不会超时退出,这很不好。
让我们用Perl把所有的命令都加上超时退出的功能——
01 | #! /usr/bin/env perl |
02 | use POSIX qw(strftime WNOHANG); |
03 |
04 | #check input |
05 | my $timeout = shift @ARGV ; |
06 | my ( $secs ) = $timeout =~ /--timeout=(\d+)$/; |
07 | unless ( $secs ) |
08 | { |
09 | print "Usage: ./timeout --timeout=[SECONDS] [COMMAND] \n" ; |
10 | exit -1; |
11 | } |
12 |
13 | #fork and exec |
14 | my $status = 0; |
15 | $SIG {CHLD} = sub { while ( waitpid (-1,WNOHANG)>0){ $status = -1 unless $? == 0; exit $status ;} }; |
16 | $0 = 'timeout hacked ' . $ARGV [0]; |
17 | defined ( my $child = fork ); |
18 | if ( $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 |
27 | sleep $secs ; |
28 | $status = -1; |
29 | kill TERM => $child ; |
30 | sleep 1 and kill INT => $child if kill 0 => $child ; |
31 | sleep 1 and kill KILL => $child if kill 0 => $child ; |
32 | exit $status ; |
./timeout.pl --timeout=3 sleep 500
【 Perl 】如何简单控制perl脚本超时
1 | eval |
2 | { |
3 | local $SIG {ALRM} = sub { die "alarmn" }; |
4 | alarm $config { 'perl' }{ 'time_out' }; |
5 | do $plugin ; |
6 | alarm 0; |
7 | }; |
没有评论:
发表评论