1

我有一个 perl 脚本,我想生成一个进程。这可能需要一段时间,大多数时候父脚本会退出。我如何生成这个进程,以便当父进程消失时它不会变成僵尸或已失效的进程?

编辑:我想我找到了两种方法。希望有人能告诉我哪个更合适?

  1. 设置 $SIG{CHLD} = 'IGNORE';
  2. 使用 POSIX 'setsid';

编辑:生成的进程也将是另一个 perl 脚本。

4

1 回答 1

4

一个进程在它退出并且在它的父进程通过wait(). 当一个进程分叉另一个进程然后退出时,子进程将成为 pid 1(经典的“init”)的父进程,它会立即获取进程状态。所以通常问题与你描述的相反:孩子变成了僵尸(因为父母没有被写来处理SIGCHLD和调用wait())但是当父母退出时,僵尸被继承init并立即收割。实际上,将子进程与其父进程完全分离(“守护进程”)的常用解决方案包括有意分叉并让中间进程退出,以便守护进程立即成为init.

编辑:如果您在 shell 中并想达到此效果,请尝试(subprocess &). 括号创建一个子shell,它subprocess在后台执行,然后立即退出。

于 2011-04-08T18:19:29.713 回答