【问题标题】:Perl pipe hangs and process becomes defunctPerl 管道挂起,进程失效
【发布时间】: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 可能与某些东西有关;所以向它添加一个信号处理程序,您可以在其中根据需要清理/关闭资源。如果这不是你所追求的,你能说出目标吗?

标签: perl pipe


【解决方案1】:

当程序退出时,它会变成僵尸(已失效的进程),直到其父进程(通过调用 wait)收割它。[1] 如果进程完全消失,程序将不会能够获得子进程的退出代码。这是完全正常的,不是问题。

  1. 孤儿(包括僵尸孤儿)被进程 1 收养,当他们完成时,它会立即收割它的孩子。

【讨论】:

    猜你喜欢
    • 2018-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-07
    • 1970-01-01
    • 1970-01-01
    • 2018-03-11
    • 2013-08-21
    相关资源
    最近更新 更多