怎么使服务起来后父进程退出为1

在做稳定性测试时发现某进程ㄖ志停了,也没有退出日志也没有别的,就一顿操作然后把进程搞成了僵尸进程 defunct 。(疑似是 gdb attach 时pkill -9 该线程了)

试着 kill 9 ppid 。僵尸进程的父进程退出变成了1但是僵尸进程还存在。

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

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

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

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

想到这个进程在变成僵尸进程前,用 gdb attatch 试图找到进程出现的问题

具体的问題也没排查出来,桑心!

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

D 无法中断的休眠状态(通常 IO 的进程);
R 正在运行可中在队列中可过行的;
W 进入内存交换(从内核2.6開始无效);
X 死掉的进程(从来没见过);

< 优先级高的进程
L 有些页被锁进内存;
s 进程的领导者(在它之下有子进程);

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

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

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

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

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

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

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

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

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

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

}

你先试试看Kill 9 能不能杀死

在我的印潒里面 kill 9 和 kill 15 都不能杀死僵尸进程

我记得解决方法是kill掉僵尸进程的父进程退出,这样僵尸进程就会变成孤儿进程然后init就会给他收尸了

你能告诉我怎么 一个一个杀吗? 除了kill掉父进程退出

要是告诉我的话 我就能告诉你怎么集体收尸

我一般都是重启..... 安静了

}

毕业于中北大学测控技术与仪器專业本科学位。从事编程3年擅长电脑的问题,LTE的问题

则子进程的父进程退出 ID 变为 1,即 init fork()的...会产生一个新的子进程, 其子进程会复制父进程退出的

同时该子进程将会变为僵尸进程

你对这个回答的评价是?

引用林小兀66的回答:

则子进程的父进程退出 ID 变为 1,即 init fork()的...会产生一个新的子进程, 其子进程会复制父进程退出的

同时该子进程将会变为僵尸进程

如果父进程退出先退出子进程会变成孤儿进程,并交给进程号为1的托管;如果子进程退出但是父进程退出没有调用wait或者waitpid对子进程的状态进行回收,那么子进程还存在于系统中并仍然占用一个进程号,此时此进程就会变成僵尸进程楼主僵尸进程和孤儿进程概念混淆。

你对这个回答的评价是

}

我要回帖

更多关于 父进程 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信