gpt4 book ai didi

perl - perl 上的 coreutils 超时模拟

转载 作者:行者123 更新时间:2023-11-29 09:15:21 26 4
gpt4 key购买 nike

我尝试使用 perl 替换超时(centos5 需要)

这里是脚本:

#!/usr/bin/perl
use strict;
my $pid=$$;
my $timeout=shift;
my @args=@ARGV;
eval {
local $SIG{ALRM} = sub {
print "Timed OUT!\n";
exit 142;
kill 9,$pid;
};
alarm($timeout);
system(@args);
};
exit $?;

在测试时我发现:

一切都很好

time /tmp/timeout 3 sleep 6
Timed OUT!

real 0m3.007s
user 0m0.000s
sys 0m0.004s

但这里都不好

time echo `/tmp/timeout 3 sleep 6`
Timed OUT!

real 0m6.009s
user 0m0.000s
sys 0m0.004s

在我的 debian 系统上,我使用 /usr/bin/timeout 进行了测试:

time echo `/usr/bin/timeout 3 sleep 6`


real 0m3.004s
user 0m0.000s
sys 0m0.000s

所以问题

  • 为什么 perl 脚本工作起来如此奇怪?
  • 是否有任何真正有效的方法可以在 perl 上写入超时,这与二进制超时的工作方式相同?

请注意,我知道 /usr/share/doc/bash-3.2/scripts/timeout 并且我还发现它的行为与我的 perl 方法相同

另请注意,我无法在针对此脚本的服务器上从 CPAN 安装模块

我尝试使用 exec() 但在那种情况下它不处理 sub 中的信号。

UPD

使用来自@rhj 的脚本(必须稍作修改)

#!/usr/bin/perl
use strict;
use warnings;
my $PID=$$;
my $timeout=shift;
my @args=@ARGV;

my $pid = fork();
defined $pid or die "fork: $!";
$pid == 0 && exec(@args);

my $timed_out = 0;
$SIG{ALRM} = sub { $timed_out = 1; die; };
alarm $timeout;
eval { waitpid $pid, 0 };
alarm 0;
if ($timed_out) {
print "Timed out!\n";
kill 9, $pid;
kill 9, $PID;
}
elsif ($@) {
warn "error: $@\n";
}

它通过了上面的测试,但在调用外部脚本的情况下失败了:

运行脚本

#!/bin/sh
sleep 6

测试.sh

#!/bin/sh
a=`./timeout.pl 2 ./run_script.sh`

输出

$ time ./test.sh 

real 0m6.020s
user 0m0.004s
sys 0m0.008s

最佳答案

此版本应该始终有效:

#!/usr/bin/perl
use strict;
use warnings;
my $pid=$$;
my $timeout=shift;
my @args=@ARGV;

my $pid = fork();
defined $pid or die "fork: $!";
$pid == 0 && exec(@args);

my $timed_out = 0;
$SIG{ALRM} = sub { $timed_out = 1; die; };
alarm $timeout;
eval { waitpid $pid, 0 };
alarm 0;
if ($timed_out) {
print "Timed out!\n";
kill 9, $pid;
}
elsif ($@) {
warn "error: $@\n";
}

不过,它不会处理 exec() 调用中的错误。

关于perl - perl 上的 coreutils 超时模拟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15042004/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com