前言
- 模拟僵尸进程
- 模拟孤儿进程
- 如何正确回收子进程,没有正确回收会有哪些问题
- 先杀掉父进程,子进程会咋样: 会被init接管
- 先杀子进程,父进程会如何?关键在于父进程有没有正确回收,如果没有回收会有僵尸进程
- kill 信号的不同效果
模拟僵尸进程
- 僵尸进程的定义: 子进程退出之后,父进程没有正常回收
- 模拟僵尸进程: 让子进程先退出,
验证代码
#!/usr/bin/python
import os,sys,time
pid = os.fork()
getpid = os.getpid()
getppid = os.getppid()
if pid == 0:
print("this is child pid=%d,getpid=%d,getppid=%d" %(pid,os.getpid(),os.getppid()))
time.sleep(10)
print("this is child pid=%d,getpid=%d,getppid=%d" % (pid, os.getpid(), os.getppid()))
else:
print("This is parent pid=%d,getpid=%d,getppid=%d"%(pid,getpid,getppid))
##或者os.wait(), 使用os.WNOHANG要注意,它是非阻塞命令,需要确定在子进程
##退出之后再调用,或者使用信号处理函数
os.waitpid(-1, os.WUNTRACED)##移除后父进程就无法回收子进程,导致变成僵死进程
time.sleep(20)
僵尸进程的处理
- 方法1: SIGCHLD信号: 子进程结束后,会向父进程发送此信号,signal(SIGCHLD, SIG_IGN); 父进程忽略SIGCHILD信号后,init进程将进行接管
- 方法2: 父进程回收: os.waitpid
- 方法3: kill调僵尸进程的父进程,父进程死后,僵尸进程会成为孤儿进程,init将进行接管处理
僵尸进程的危害
僵尸进程会占用系统资源,如果很多,则会严重影响服务器的性能; 孤儿进程不会占用系统资源,最终是由init进程托管,由init进程来释放;
如何杀死某个会话下面的所有子进程
有些系统没有会话 ID 的概念。即使是具有会话 ID 的系统,例如 Linux,也没有提供系统调用来终止会话中的所有进程。你需要遍历 /proc 输出的进程树,收集所有的 SID,然后一一终止进程
常用命令
- 查看其父进程信息 pstree -asp 57465
- 查看进程的状态(僵尸,running等状态)
ps -aux | grep pid