在perl中重定向输出时fork exec kill的问题
发布时间:2020-12-15 21:59:04 所属栏目:大数据 来源:网络整理
导读:我在perl中创建了一个脚本来运行超时的程序.如果正在执行的程序需要更长的时间,那么超时将比脚本终止该程序并返回消息“TIMEOUT”. 脚本工作得很好,直到我决定重定向执行程序的输出. 当stdout和stderr被重定向时,脚本执行的程序没有被杀死,因为它的pid与我从
我在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 $kidn"; if ($timeout > 0 && $time > $timeout) { print "TIMEOUT!n"; #Kill process kill 9,$pid; exit(3); } } if ( $kid == -1) { print "Process did not existn"; 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将告诉shell由perl生成的用very_long_program替换自己,而不是像孩子一样运行very_long_program. (在这种情况下perl生成shell的原因是因为$cmd包含重定向字符 – 而perl不知道如何自己处理它们.另一种解决问题的方法是在fork之后在perl中进行重定向( )但在调用exec()之前 – 但这有点棘手,所以首先尝试exec解决方法!) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |