试试穷人的警报器
my $pid;
if ($^O eq 'MSWin32') {
$pid = system 1, "prog arg"; # Win32 only, run proc in background
} else {
$pid = fork();
if (defined($pid) && $pid == 0) {
exec("proc arg");
}
}
my $poor_mans_alarm = "sleep 1,kill(0,$pid)||exit for 1..$TIMEOUT;kill -9,$pid";
system($^X, "-e", $poor_mans_alarm);
穷人的警报在一个单独的进程中运行。每秒,它都会检查标识符为 $pid 的进程是否仍然存在。如果进程不存在,则警报进程退出。如果进程在 $time 秒后仍然存在,它会向进程发送一个终止信号(我使用 9 使其不可捕获,使用 -9 取出整个子进程树,您的需求可能会有所不同。kill 9,...
也是便携式的)。
Edit:如何通过穷人的警报捕获该过程的输出?
不使用反引号——那么您将无法获取进程 ID,并且如果进程超时并被终止,您可能会丢失中间输出。替代方案是
1)将输出发送到文件,进程完成后读取文件
$pid = system 1, "proc arg > some_file";
... start poor man's alarm, wait for program to finish ...
open my $fh, '<', 'some_file';
my @process_output = <$fh>;
...
2)使用Perl的open
开始该过程
$pid = open my $proc, '-|', 'proc arg';
if (fork() == 0) {
# run poor man's alarm in a background process
exec($^X, '-e', "sleep 1,kill 0,$pid||exit ...");
}
my @process_output = ();
while (<$proc>) {
push @process_output, $_;
}
The while
当进程自然或非自然结束时,循环就会结束。