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