gpt4 book ai didi

perl - 在Perl中重定向输出时fork exec杀死的问题

转载 作者:行者123 更新时间:2023-12-04 13:29:41 25 4
gpt4 key购买 nike

我在perl中创建了一个脚本来运行带有超时的程序。如果正在执行的程序花费的时间超过脚本,则超时将杀死该程序并返回消息“TIMEOUT”。

该脚本运行良好,直到我决定重定向已执行程序的输出。

重定向stdout和stderr时,脚本执行的程序不会被杀死,因为它的pid与我从fork获得的pid不同。

在重定向的情况下,perl似乎执行了一个执行我的程序的shell。

我想进行输出重定向,但是在超时的情况下仍然可以终止程序。

关于我该怎么做的任何想法?

我的脚本的简化代码是:

#!/usr/bin/perl

use strict;
use warnings;
use POSIX ":sys_wait_h";

my $timeout = 5;
my $cmd = "very_long_program 1>&2 > out.txt";

my $pid = fork();
if( $pid == 0 )
{
exec($cmd) or print STDERR "Couldn't exec '$cmd': $!";
exit(2);
}
my $time = 0;
my $kid = waitpid($pid, WNOHANG);
while ( $kid == 0 )
{
sleep(1);
$time ++;
$kid = waitpid($pid, WNOHANG);
print "Waited $time sec, result $kid\n";
if ($timeout > 0 && $time > $timeout)
{
print "TIMEOUT!\n";
#Kill process
kill 9, $pid;
exit(3);
}
}

if ( $kid == -1)
{
print "Process did not exist\n";
exit(4);
}
print "Process exited with return code $?\n";
exit($?);

谢谢你的帮助。

最佳答案

尝试从更改$cmd

my $cmd = "very_long_program 1>&2 > out.txt";


my $cmd = "exec very_long_program 1>&2 > out.txt";
exec将告诉perl生成的shell用very_long_program替换自身,而不是像子进程一样运行very_long_program。

(在这种情况下,perl产生 shell 的原因是因为 $cmd包含重定向字符-并且perl不知道如何处理它们本身。解决该问题的另一种方法是在 fork()之后但先于perl本身在perl中进行重定向调用 exec()-有点棘手,因此请首先尝试 exec解决方法!)

关于perl - 在Perl中重定向输出时fork exec杀死的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2965067/

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