最近一台机器的systemd内存高达30%多,一直不变,后来排查是僵尸进程,什么是僵尸进程呢,只能google,百度等先了解,然后自己总结了一下,虽然这是基础的东西,但是对于我来说就如新大陆一样。花了一下午可算明白了。模拟的时候主要是先要理解fork这个函数的东西。总结的不对的地方望给位大哥指出
 
什么是僵尸进程?什么是孤儿进程?
 
僵尸进程:一个进程使用fork() 创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中,这种进程称之为僵尸进程
 
孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么这些进程将会成为孤儿进程。孤儿进程将会被init进程(进程号为1)所收养,并由init进程对他们完成状态收集工作
 
模拟僵尸进程和孤儿进程
 
1:使用os.fork()之后,子进程是父进程的复制品,在内存中会把父进程的代码及内存分配情况拷贝一份生成子进程的运行空间,这样子进程与父进程的所有代码都一样,两个进程之间的运行时独立的,互不影响。在父进程中获取到的pid是子进程的pid号,在子进程中获取的pid是0.
 
python脚本:
#!/usr/bin/python

import os,sys,time

pid = os.fork()

if pid == 0:
print "this is child pid=",pid
else:
print "This is parent pid=",pid
在执行上面这段代码的时候,会有两个独立的运行空间独立的代码来执行,在父进程中执行的时候,由于返回的是子进程的pid,所以不会等于0,就走else。
在子进程的独立的运行空间执行上面的那份代码,因为fork给子进程返回的是0,所以就走if那条。
 
执行结果:
 
fork()函数被调用一次,返回两次。两次返回的区别是子进程的返回值是0,而父进程的返回值则是新子进程的进程ID
 
2: getpid(),petppid()  
os.getpid() 获取的是当前进程的进程号
os.getppid() 获取当前进程的父进程的进程号
 
python脚本:
#!/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,getpid,getppid)
else:
print "This is parent pid=%d,getpid=%d,getppid=%d"%(pid,getpid,getppid)
执行结果:
 
这里为什么子进程的父进程PID是1呢,而不是创建它的父进程ID104809呢,这问题就是上面孤儿进程现象了,看上面的输出结果可以看到,父进程先执行完,后执行的子进程,这就意味着,子进程执行完了的时候,父进程已经不在了,就成了孤儿进程,孤儿进程最终会由init,也就是进程1收养,把它杀掉
 
3:模拟僵尸进程
 
python脚本:
#!/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,getpid,getppid)
else:
print "This is parent pid=%d,getpid=%d,getppid=%d"%(pid,getpid,getppid)
time.sleep(10)
执行结果:
 
这里可以看到子进程的父进程pid确实是创建自己的父进程,但是子进程已经成了僵尸进程,通过top命令或者grep def查看
 
 
子进程成了僵尸进程是因为子进程结束的时候,父进程还在睡觉,不能调用wait()或waitpid()去获取子进程的终止状态,但是等父进程醒来的时候,就会把僵尸进程给处理掉
 
4:真实环境下僵尸进程产生了怎么解决
 
      暂时知道的办法是:根据僵尸进程找出僵尸进程的父进程,通过杀父进程的方式删掉僵尸进程,但是线上环境不要轻易删父进程
      常用的命令有:
      ps -ef |grep def                                查看僵尸进程   
      ps -e -o pid,stat |grep Z                   查看僵尸进程的pid
      ps -e -o ppid,stat |grep Z                 查看僵尸进程的父进程
      
5:如何避免僵尸进程的产生
      这还有待研究
 
 
参考博文及书籍

《UNIX环境高级编程中文版》

下载地址:https://pan.baidu.com/s/1mios8Wg 密码:zlig

Python脚本模拟僵尸进程与孤儿进程的更多相关文章

  1. python学习笔记—— 多进程中的 孤儿进程和僵尸进程

    1 基本概述 1.1 孤儿进程和僵尸进程 父进程创建子进程后,较为理想状态是子进程结束,父进程回收子进程并释放子进程占有的资源:而实际上,父子进程是异步过程,两者谁先结束是无顺的,一般可以通过父进程调 ...

  2. Python进阶----进程间数据隔离, join阻塞等待, 进程属性, 僵尸进程和孤儿进程, 守护进程

    Python进阶----进程间数据隔离, join阻塞等待, 进程属性, 僵尸进程和孤儿进程, 守护进程 一丶获取进程以及父进程的pid 含义:    进程在内存中开启多个,操作系统如何区分这些进程, ...

  3. 进程(守护进程--互斥锁--IPC机制--生产者模型--僵尸进程与孤儿进程--模拟抢票--消息队列)

    目录 一:进程理论知识 1.理论知识 二:什么是进程? 三:僵尸进程与孤儿进程 1.僵尸进程 四:守护进程 1.什么是守护进程? 2.主进程创建守护进程 3.守护进程 五:互斥锁(模拟多人抢票) 1. ...

  4. [并发编程 - socketserver模块实现并发、[进程查看父子进程pid、僵尸进程、孤儿进程、守护进程、互斥锁、队列、生产者消费者模型]

    [并发编程 - socketserver模块实现并发.[进程查看父子进程pid.僵尸进程.孤儿进程.守护进程.互斥锁.队列.生产者消费者模型] socketserver模块实现并发 基于tcp的套接字 ...

  5. Linux-进程描述(3)之进程状态僵尸进程与孤儿进程

    进程状态 进程状态反映进程执行过程的变化.这些状态随着进程的执行和外界条件的变化而转换.为了弄明正正在运行的进程是什么意思,我们需要知道进程的不同状态.一个进程可以有多个状态(在Linux内核中,进程 ...

  6. 多进程wait、僵尸进程、孤儿进程、prctl

    1.概念 1.孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程.孤儿进程将被init进程(进程号为1)所收养,从而保证每个进程都会有一个父进程.而Init进程会自 ...

  7. 【Linux 进程】孤儿进程、僵尸进程和守护进程

    1.孤儿进程: 孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程.孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作.孤儿进程是 ...

  8. 子进程回收资源两种方式,僵尸进程与孤儿进程,守护进程,进程间数据隔离,进程互斥锁,队列,IPC机制,线程,守护线程,线程池,回调函数add_done_callback,TCP服务端实现并发

    子进程回收资源两种方式 - 1) join让主进程等待子进程结束,并回收子进程资源,主进程再结束并回收资源. - 2) 主进程 “正常结束” ,子进程与主进程一并被回收资源. from multipr ...

  9. day34——僵尸进程和孤儿进程、互斥锁、进程之间的通信

    day34 僵尸进程和孤儿进程 基于unix环境(linux,macOS) 主进程需要等待子进程结束之后,主进程才结束 主进程时刻监测子进程的运行状态,当子进程结束之后,一段时间之内,将子进程进行回收 ...

随机推荐

  1. 谈谈如何给下拉框option添加点击事件?

    我们在用到下拉列表框select时,需要对选中的<option>选项触发事件,其实<option>本身没有触发事件方法,我们只有在select里的onchange方法里触发. ...

  2. 第 8 章 容器网络 - 062 - 如何使用 flannel host-gw backend?

    flannel host-gw backend flannel 支持多种 backend:(1)vxlan backend:(2)host-gw: 与 vxlan 不同,host-gw 不会封装数据包 ...

  3. z2-xcode使用

    @xcode区块命名 左边导航栏,右边工具栏,下边调试栏 @快捷键 最常用的#显示/隐藏导航栏:Command+ (反选一样Command+) #显示/隐藏工具栏:Command+Option+ (反 ...

  4. 『TensorFlow』函数查询列表_神经网络相关

    tf.Graph 操作 描述 class tf.Graph tensorflow中的计算以图数据流的方式表示一个图包含一系列表示计算单元的操作对象以及在图中流动的数据单元以tensor对象表现 tf. ...

  5. Oracle DB 使用RMAN恢复目录

    • 对恢复目录和RMAN 资料档案库控制文件的使用进行比较• 创建和配置恢复目录• 在恢复目录中注册数据库• 同步恢复目录• 使用RMAN 存储脚本• 备份恢复目录• 创建虚拟专用目录 RMAN 资料 ...

  6. 使用python绘制根轨迹图

    最近在学自动控制原理,发现根轨迹这一张全是绘图的,然而书上教的全是使用matlab进行计算机辅助绘图.但国内对于使用python进行这种绘图的资料基本没有,后来发现python-control包已经将 ...

  7. Maximum Average Subarray

    Given an array with positive and negative numbers, find the maximum average subarray which length sh ...

  8. Kerberos主从配置文档

    Kerberos主从配置文档   1. Kerberos主从同步机制 在Master上通过以下命令同步数据: kdb5_util dump /var/kerberos/krb5kdc/slave_db ...

  9. centos 解决中文支持问题, 如此修改可以修正eclipse 乱码问题。

    一.中文支持 安装中文语言包: yum groupinstall chinese-support 修改字符编码配置,没有这个文件就创建它: vim /etc/sysconfig/i18n 为 LANG ...

  10. JavaScript之Math

    1. Math Math是js的内置函数,无需创建,把Math作为对象使用就可以调用其属性和方法. 2.Date    2.1 日期对象创建 var now = new Date ( ); 含参数时表 ...