最近一台机器的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. python requests 上传文件

    token="eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkYXRhIjoiZWM2ZWFjZjFjM2UzYzEyOWU3ODA4YjgwNzkxNGI ...

  2. JxBrowser之一:Java嵌入Chrome浏览器

    1.JxBrowser是一个让Java可以轻松集成Chrome浏览器的跨平台库:一般用于网络爬虫或者网页自动化测试等. 官方网址:https://jxbrowser.support.teamdev.c ...

  3. Android查看appPackage和Activity的多种方法

    方法一 有源码的情况直接打开AndroidManifest.xml文件,文件会有package信息 android.intent.action.MAIN决定应用程序最先启动的Activity andr ...

  4. Sonya and Problem Wihtout a Legend CodeForces - 714E (dp)

    大意: 给定序列, 每次操作可以任选一个数+1/-1, 求最少操作数使序列严格递增. 序列全-i后转化为求最少操作数使序列非降, 那么贪心可以知道最后$a_i$一定是修改为某一个$a_j$了, 暴力d ...

  5. mysql 表中已经存在数据 修改字段类型 varchar(11) 改为 int(11)

    update tablename set s_role = '' alter table  tablename  modify column s_role int(11)

  6. jsp九大内置对象 ,三大指令,四大作用域,七大动作

    九大内置对象: application:应用程序对象 对整个web工程都有效 request:对当前请求的封装 pageConfig:只对当前页面有效,里面封装了基本request和session的对 ...

  7. python基础11_函数作用域_global_递归

    看到了一个16进制转换的小知识点,就验证了一下运行结果. #!/usr/bin/env python # coding:utf-8 # 看到了16进制转换的问题.顺便验证一下. a = 255 b = ...

  8. 真机*Appium

    一.真机连接电脑123 1.一般android手机的的USB调试模式在设置里的开发者选项中,找到开发者选项,打开USB调试 2.cmd命令→[adb devices]→回车,得到真机设备 可能存在问题 ...

  9. swift3.0自定义相机界面

    这是公司上上上一个项目的自定义相机界面,原来是swift2.0写的,今天改为swift3.0,记录一下. 效果图如下:                                         ...

  10. vue 使用vux封装的微信分享

    main.js引入 import {WechatPlugin} from 'vux' Vue.use(WechatPlugin) 公共的jswxShare.js import Vue from 'vu ...