【发布时间】:2018-12-20 03:37:13
【问题描述】:
我有一个使用管道执行另一个脚本的 perl 脚本:
$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可能与某些东西有关;所以向它添加一个信号处理程序,您可以在其中根据需要清理/关闭资源。如果这不是你所追求的,你能说出目标吗?