最近一台机器的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. Kotlin 循环控制

    For 循环 for 循环可以对任何提供迭代器(iterator)的对象进行遍历,语法如下: for (item in collection) print(item) 循环体可以是一个代码块: for ...

  2. [原][工具][windows10安装][0x800F081F]windows 10 如何离线安装.net framework3.5 || 安装出现错误代码0x800F081F时如何解决

    参考解决方案:https://zhidao.baidu.com/question/1896669183365806820.html?fr=iks&word=win10%B0%B2%D7%B0+ ...

  3. MVC扩展HttpHandler

    扩展用来做防盗链    访问特殊后缀名的处理方式 localhost:8080/Home/index.aspx      localhost:8080/Home/mao.jpg 比如 这样一个地址  ...

  4. three.js 第一篇:准备工作

    demo展示:https://www.hanjiafushi.com/three/index.html 1:复习向量知识 2:学习矩阵知识 3:推荐先看webGL入门指南,对一些基础性的概念有所了解 ...

  5. gulp下单页面应用打包

    项目地址:https://pan.baidu.com/s/1cu4WW2 之前已经说过多入口打包,最近正好做一个单页面应用,之前多人口是用webpack打包的,但是感觉webpack比较重,单页面我又 ...

  6. C++开发者都应该使用的10个C++11特性 转

    http://blog.jobbole.com/44015/// | 分类: C/C++, 开发 | 条评论 | 标签: C++, C语言 分享到: 本文由 伯乐在线 - 治不好你我就不是兽医 翻译自 ...

  7. shell脚本结构

    echo $? 代表上一次命令的状态返回值,‘0’则代表为真<执行成功>,‘非零’则代表为假<执行失败>. shell脚本: <判断老男孩的年纪> [root@bo ...

  8. 网络编程-day1

    一. *** C/S架构:客户端(client)/服务端(server)架构, B/S架构:浏览器(browser) / 服务端(server)架构 软件cs架构:浏览器,qq,微信,陌陌等等 硬件c ...

  9. idea:打包jar(原文by曲高终和寡)

    idea打包java可执行jar包   1,在项目上鼠标右键 --> Open Module Settings 2, Artifacts --> + --> JAR --> F ...

  10. day058 聚合 分组查询 自定义标签过滤器 外部调用django环境 事务和锁

    1.聚合(aggregate) 聚合的主要语法: from django.db.models import Avg , Max , Min , Count models.类名 .objects.all ...