c环境下
一、linux下
zombie2.c
#include<stdio.h>
#include<stdlib.h>
int main(){
int i=0;
int p=fork();
if(p==0){
sleep(5);
printf("\nchild pid:%d,ppid:%d\n",getpid(),getppid());
}
if(p>0){
printf("\nparent pid:%d,ppid:%d\n",getpid(),getppid());
while(1){
sleep(1);
i++;
}
}
return 0;
}
运行
gcc zombie2.c -o zombie2.out
./zombie2.out
ctrl+z挂起父进程,然后top查看,可以看见一个zombie
定位僵尸进程
ps -A -ostat,ppid,pid,cmd | grep -e '^[Zz] '
中止僵尸进程(杀死父进程以彻底结束僵尸进程)
kill -9 ppid
2.docker下
dockerfile
FROM gcc:latest
ADD zombie2.out /
CMD ["./zombie2.out"]
建立容器
docker build -t dockerfile .
docker ps查看container id
docker exec -it container_id /bin/bash
./zombie2.out
top查看,zombie进程数量为0
kill -9 父进程并重启,再次top查看
和linux下同样一个zombie进程
生成多个僵尸进程
#include<stdio.h>
#include<stdlib.h>
int main(){
int i=0;
while(i<10){
i++;
int p=fork();
if(p==0){
sleep(1);
printf("\nchild pid:%d,ppid:%d",getpid(),getppid());
return 0;
}
if(p>0){
}
}
while(1){
sleep(10);
i++;
}
return 0;
}
python环境下
生成一个僵尸进程
#! /usr/bin/python
import os,time
p=os.fork()
if p==0:
time.sleep(1)
print("\nchild pid:%d,ppid:%d\n",os.getpid(),os.getppid())
if p>0:
print("parent pid:%d,ppid:%d",os.getpid(),os.getppid())
while 1:
time.sleep(10)
生成很多僵尸进程
#! /usr/bin/python
import os,time
i=0
while(i<10):
i=i+1
p=os.fork()
if p==0:
time.sleep(1)
print("\nchild pid:%d,ppid:%d\n",os.getpid(),os.getppid())
if p>0:
while(1):
time.sleep(10)
只有最后一个进程变成了僵尸,因为每一个新的子进程都会变成下一个子进程的父进程
#! /usr/bin/python
import os,time
i=0
while(i<10):
i=i+1
p=os.fork()
if p==0:
time.sleep(1)
print "child pid:%d,ppid:%d\n" % (os.getpid(),os.getppid())
if p>0:
print "parent pid:%d,ppid:%d\n" % (os.getpid(),os.getppid())
while(1):
time.sleep(10)
完全无法生成僵尸
docker下
用python镜像生成一个容器,把生成僵尸和监测cpu的程序拷贝上去
docker cp 源地址 容器:目标地址
docker cp /root/codes/zomebietest/test.py mypython:/myapps/zombietest/
启动容器并运行僵尸程序
ctrl+z中断后top查看
用pythoncpu.py读取不到信息,top查看发现僵尸进程的cpu使用率是0,所以-bi读取不到,改成-b
要在docker中查看文件需要安装vim,apt-get install vim如果报错,则先apt-get update