Perl管道挂起,进程失效
我有一个perl脚本,它使用管道执行另一个脚本:Perl管道挂起,进程失效,perl,pipe,Perl,Pipe,我有一个perl脚本,它使用管道执行另一个脚本: $pid = open (OUTPUT, "my_script.pl 2>&1 |") || ""; if ($pid) { while (<OUTPUT>) { print; } close (OUTPUT); } $pid=open(输出,“my_script.pl 2>&1|”)||; 如果($pid){ 而(){ 印刷品; } 关闭(输出); } my_script.pl派生另一个子进程。
$pid = open (OUTPUT, "my_script.pl 2>&1 |") || "";
if ($pid) {
while (<OUTPUT>) {
print;
}
close (OUTPUT);
}
$pid=open(输出,“my_script.pl 2>&1|”)||;
如果($pid){
而(){
印刷品;
}
关闭(输出);
}
my_script.pl
派生另一个子进程。当我第一次杀死my_script.pl
然后杀死它的子进程时(我使用kill-9
手动杀死这些进程),然后my_script.pl
进程将失效,管道挂起。
你知道如何解决这个问题吗
我不想先杀死子进程。当一个程序退出时,它会变成一个僵尸(失效的进程),直到它的父进程(通过调用
wait
)获取它为止。[1]如果进程完全消失,程序将无法获得子进程的退出代码。这是完全正常的,不是问题
您是否希望
my_script.pl
即使您kill-9 parent_script.pl
也继续运行?我希望在所有子脚本被kill时父脚本关闭管道。。。但问题是,我的_script.pl已经失效了——我不知道什么时候会发生什么。您能否添加一个列表/树,列出哪个进程启动哪个其他进程,然后告诉我们哪个进程何时被终止?我猜您希望将所有进程移动到一个进程组中,以便它们一起被终止,但我还不理解您的问题。如果“管道挂起”,则某些进程仍然打开管道的写入端。发布my_script.pl
可能产生的所有进程的进程树。至少其中一个仍在运行。您希望能够执行什么操作?要在脚本运行时从命令行手动杀死my_script.pl
?这是“粗鲁”的,你应该预料到它可能不会干净地工作,正是因为my_script.pl
可能被某种东西束缚住了;因此,向它添加一个信号处理程序,您可以在其中根据需要清理/关闭资源。如果这不是你想要的,你能说出你的目标吗?