我有一个 perl 脚本,我想生成一个进程。这可能需要一段时间,大多数时候父脚本会退出。我如何生成这个进程,以便当父进程消失时它不会变成僵尸或已失效的进程?
编辑:我想我找到了两种方法。希望有人能告诉我哪个更合适?
- 设置 $SIG{CHLD} = 'IGNORE';
- 使用 POSIX 'setsid';
编辑:生成的进程也将是另一个 perl 脚本。
我有一个 perl 脚本,我想生成一个进程。这可能需要一段时间,大多数时候父脚本会退出。我如何生成这个进程,以便当父进程消失时它不会变成僵尸或已失效的进程?
编辑:我想我找到了两种方法。希望有人能告诉我哪个更合适?
编辑:生成的进程也将是另一个 perl 脚本。
一个进程在它退出并且在它的父进程通过wait()
. 当一个进程分叉另一个进程然后退出时,子进程将成为 pid 1(经典的“init”)的父进程,它会立即获取进程状态。所以通常问题与你描述的相反:孩子变成了僵尸(因为父母没有被写来处理SIGCHLD
和调用wait()
)但是当父母退出时,僵尸被继承init
并立即收割。实际上,将子进程与其父进程完全分离(“守护进程”)的常用解决方案包括有意分叉并让中间进程退出,以便守护进程立即成为init
.
编辑:如果您在 shell 中并想达到此效果,请尝试(subprocess &)
. 括号创建一个子shell,它subprocess
在后台执行,然后立即退出。