什么是僵尸进程和孤儿进程?怎样处理僵尸进程?
先自己想一想,再看参考要点
参考要点
- 子进程退出后,进程描述符要等父进程调用 wait() 或 waitpid() 取得子进程的信息后才释放,父进程一直不调用时,子进程就成为僵尸进程,ps 中的状态为 Z
- 进程号是有限的,大量僵尸进程会导致系统无法创建新进程
- 根本的办法是让父进程正确回收子进程,多个子进程同时退出时父进程可能只收到一次 SIGCHLD,所以要循环调用 waitpid(-1, &status, WNOHANG)
- 父进程先退出时,还在运行的子进程成为孤儿进程,由所在 PID 命名空间的 1 号进程(init)收养并回收,所以无法修改父进程时可以杀死父进程
- 容器中的 1 号进程如果是不调用 wait() 的业务程序,孤儿进程退出后会一直是僵尸进程,可以用 docker run --init 让 tini 作为 1 号进程