父进程为1号进程(ppid=1)的僵尸进程处理和分析


首先是   父进程为1号进程的进程 会不会成为僵尸进程??


---------------------------------------普通进程------------------------------------------


普通进程,父进程不主动去回收子进程的资源。
一个子进程在其父进程还没有调用wait()或waitpid()的情况下退出。这个子进程就是僵尸进程。产生僵尸进程的原因:
1、子进程结束后向父进程发出SIGCHLD信号,父进程默认忽略了它;
2、父进程没有调用wait()或waitpid()函数来等待子进程的结束;


处理办法:把父进程杀掉,僵尸进程会变成孤儿进程,然后过继给1号进程,而1号进程会扫描名下子进程,把 Z 状态进程回收;

这时候僵尸进程已经退出了,只保留了task_struct结构体,所以发信号(-9等信号)去处理僵尸进程是无效的;


-----------------------------------ppid=1的进程-------------------------------

通过对普通僵尸进程的分析,这样看起来好像 父进程为1号进程的进程 不会成为僵尸进程了,因为1号进程都会时刻扫描其子进程的状态。

发现是 僵尸进程就会马上去释放它的资源;


但是,父进程为1号进程的进程  其实也是有可能成为僵尸进程的。下面说几种情况:

1、进程还在被其它进程使用,退出;

2、进程的子线程还在执行任务,但主线程已经死掉了(可能主线程已经被杀了,systemd停止服务时会发SIGTERM信号);

3、进程阻塞在某一IO请求上,这时控制权已交到内核手上,这时如果子进程被KILL掉, 那么就成为父进程ID为1的僵尸进程,这个进程不会退出,会一直阻塞直到IO请求被满足;


那当出现父进程为1号进程的僵尸进程时,需要分析时,可以考虑上面几种情况;

1、查看下当前这个僵尸进程是否被其他进程使用,比如:被跟踪,调试之类的;

2、用ps -T -p <pid> 查看下这个僵尸进程的主线程是否退出;

3、用strace 跟踪下这个僵尸进程看看是否有io在等待,或者查看下载僵尸之前是否有io类的操作发生;


------------------------------------------------------我的bug分析-----------------------------------------------------------

我查看了下这个僵尸进程在变成僵尸之前的进程状态,发现开始是Ssl,然后变成了 tsl (我们有专门日志记录ps 进程列表的);


这里贴下进程的状态说明:

D 无法中断的休眠状态(通常 IO 的进程);
R 正在运行可中在队列中可过行的;
S 处于休眠状态;
T 停止或被追踪;
W 进入内存交换(从内核2.6开始无效);
X 死掉的进程(从来没见过);
Z 僵尸进程;

< 优先级高的进程
N 优先级较低的进程
L 有些页被锁进内存;
s 进程的领导者(在它之下有子进程);
l 多进程的(使用 CLONE_THREAD, 类似 NPTL pthreads);
+ 位于后台的进程组;

还有个重要的信息,在ps列表中有栏START信息,表示进程的启动时间,这个比较重要,可以看出进程是在哪天的什么时候起来的。


根据上面贴的进程状态信息,可以知道进程从休眠状态变了停止/被追踪,再根据开始说的 ppid=1的进程如果在被其他进程使用(跟踪调试等),则退出时,会有部分信息残留,导致变成僵死进程;

那就比较容易处理了,首先查看下是什么时间点变成tsl状态的,那就说明这个时间点该进程被跟踪(不知道这是不是黑客中提到的反调试,反追踪)了,在这个时间点开始查找下看看有没有进程调试跟踪该僵尸进程;


-----------------------------补充句--------------------------------------

其实ppid=1的僵尸进程可以不用去管他,因为它迟早会被1号进程回收的(如果有很多僵尸进程除外)。

并且绝大部分ppid=1的僵尸进程是暂时的:

1、当进程被跟踪调试完,则会自动被回收掉的;

2、其他子线程组的线程执行完后会自动退出,僵尸进程会被回收;

3、这个可能会一直挂着,如果阻塞的io永远没有到达;



总之,遇到少量的僵尸进程,可以不需要特意的去处理,只需要查看下根源,看看是否有潜在的bug就可以;

(记得有种攻击方法就是创建很多僵尸进程,把进程列表占满,导致系统不能再创建进程)


若有错误,欢迎指正;


猜你喜欢

转载自blog.csdn.net/YuZhiHui_No1/article/details/53011390