Perl pipe hangs and process becomes defunct
我有一个使用管道执行另一个脚本的 perl 脚本:
1 2 3 4 5 6 7
| $pid = open (OUTPUT ,"my_script.pl 2>&1 |") ||"";
if ($pid) {
while (<OUTPUT>) {
print;
}
close (OUTPUT );
} |
my_script.pl fork 另一个子进程。当我第一次杀死 my_script.pl 然后杀死它的子进程(我使用 kill -9 手动杀死进程)时,my_script.pl 进程变为无效并且管道挂起。
知道如何解决这个问题吗?
我不想先杀死子进程。
- 即使您 kill -9 parent_script.pl ,您是否希望 my_script.pl 继续运行?
-
我希望父脚本在所有子脚本都被杀死时关闭管道......但问题是 my_script.pl 变得不复存在
-
嗯 - 我不明白什么时候会发生。您能否添加一个列表/树,其中哪个进程启动了哪个其他进程,然后告诉我们哪个进程被杀死以及何时被杀死?我猜你想将所有进程移到一个进程组中,这样它们就会一起被杀死,但我还不明白你的问题。
-
如果"管道挂起",则某些进程仍然打开管道的写入端。发布 my_script.pl 可能产生的所有进程的进程树。其中至少有一个仍在运行。
-
你希望能够做什么?要在此脚本运行时从命令行手动杀死 my_script.pl?那是"粗鲁",你应该预料到它可能无法干净地工作,正是因为 my_script.pl 可能被捆绑在某些东西上;所以向它添加一个信号处理程序,您可以在其中根据需要清理/关闭资源。如果这不是你所追求的,你能说出目标吗?
-
您所说的"管道挂起"是什么意思? 1)管道不做任何事情。 2)如果你杀死 -9 父母和孩子,就没有管道。
当一个程序退出时,它会变成一个僵尸(已失效的进程),直到它的父进程(通过调用 wait)收割它。[1]如果进程完全消失,程序将无法获得子进程的退出代码。这是完全正常的,不是问题。
孤儿(包括僵尸孤儿)被进程 1 收养,当他们完成时立即收割它的孩子。