最近一台机器的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. VUE本身是不支持IE的,可用babel-polyfill解决

    一般来说VUE本身是不支持IE的,但是可以用特殊的方法来解决,亲测可用第一步:下载插件 cnpm install --save babel-polyfill第二步:入口文件main.js引入( imp ...

  2. 2018 ACM-ICPC, Syrian Collegiate Programming Contest

    2018 ACM-ICPC, Syrian Collegiate Programming Contest A Hello SCPC 2018! 水题 B Binary Hamming 水题 C Por ...

  3. 基于Bootsrap的BeyondAdmin前端模板 --分享

    1.PC端 2.移动端 3.下载 最新:http://www.yidt.cn/ 链接:https://pan.baidu.com/s/1Tx6EVmGFnVV7H7h3SFwldA 提取码:0btw

  4. hdoj5754

    题意:略 国王和骑士用记忆搜索,注意骑士的移动是x-2,y-1或x-1,y-2.车是NIM博弈,后是威佐夫博弈.注意威佐夫博弈中两堆石子有大小之分,而输入不一定小在前. #include <io ...

  5. node.js调用google翻译api

    源码下载:https://pan.baidu.com/s/1nxoodst 使用:(只支持get) http://39.106.33.56:3001/translate?text=Failure is ...

  6. c3p0 操作

    E3p0连接池 c3p0-config.xml c3p0-config.xml(必须叫这个名字),然后必须放在工程目录的src下面 注意:c3p0里面可以配置多个连接信息,可以给每个配置起个名字,这样 ...

  7. Ubuntu环境下,项目出现:Call to undefined function curl_init() 提示

    原因: 没有开启curl扩展 安装或者开启扩展 ubuntu 执行安装Curl的扩展 sudo apt-get install -y php-curl 同: mysql,redis,curl,等. 摘 ...

  8. CRM的组织架构

    PPOMA_CRM... 和ERP的组织架构一样的. 这边在功能参数里匹配ECC的组织.ECC的组织架构则会设置控制范围,成本中心啊,业务范围,公司,人事范围等. 下面说说常见函数RH_STRUC_G ...

  9. [Go back to REDIS]

    Overview 内存中的数据结构存储系统,可以用作数据库.缓存和消息中间件. redis底层数据结构:跳跃表 [为什么选skiplist而不是red-black tree] 支持多种数据结构:Str ...

  10. 使用IDEA搭建Springboot+mybatis

    1.开发工具:Intellij idea2018.2 2.通过Spring Initializr建立项目,Project SDK选择本地的jdk就可以,我的是jdk1.8,之后点击next. 修改项目 ...