首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么在Linux中父进程被杀死后,子进程仍然活着?

为什么在Linux中父进程被杀死后,子进程仍然活着?
EN

Stack Overflow用户
提问于 2011-12-16 19:13:39
回答 3查看 43.3K关注 0票数 35

有人告诉我,当你在linux中杀死父进程时,子进程就会死掉。

但我对此表示怀疑。因此,我编写了两个bash脚本,father.sh将在其中调用child.sh

下面是我的脚本:

现在我运行bash father.sh,你可以检查它ps -alf

然后我用kill -9 24588杀死了father.sh,我猜测子进程应该被终止,但不幸的是我错了。

有谁能解释一下原因吗?

thx

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-12-16 19:20:29

不,当你单独杀死一个进程时,它不会杀死子进程。

如果希望给定组的所有进程都接收信号,则必须将信号发送到进程组

例如,如果您的父进程id的代码为1234,则必须指定parentpid加上符号减号,后跟您的父进程id:

代码语言:javascript
复制
kill -9 -1234

否则,孤儿将被链接到init,如您的第三个屏幕截图所示(孩子的PPID已变为1)。

票数 51
EN

Stack Overflow用户

发布于 2014-04-25 14:12:05

代码语言:javascript
复制
pkill -TERM -P <ProcessID>

这将杀死父级和子级

票数 3
EN

Stack Overflow用户

发布于 2017-03-14 14:04:19

一般来说,杀死父母也会杀死孩子。

你看到孩子在杀死父亲后仍然活着的原因是因为孩子只会在它“选择”(内核选择)来处理SIGKILL事件之后死亡。它不需要立即处理它。您的脚本正在运行一个sleep()命令(即在内核中),该命令在休眠完成之前不会被唤醒来处理任何事件。

为什么PPID #1?父进程已终止,不再位于进程表中。child.sh现在没有莫名其妙地与init联系在一起。它根本没有运行的父进程。说它链接到init会产生这样的印象:如果我们以某种方式离开init,那么init就可以控制关闭进程。它还会造成这样的印象,即杀死父母会让祖父母成为孩子的主人。并不是两个都是真的。该子进程仍然存在于进程表中,并且正在运行,但是在它处理SIGKILL之前,不会处理基于它的进程ID的新事件。这意味着这个孩子是一个前僵尸,行尸走肉,有被贴上标签的危险。

进程组中的Killing是不同的,用来通过进程组#杀死同级和父级。同样重要的是要注意,“杀死一个进程”本身并不是“杀死”,在人类的方式中,你希望进程被销毁,所有内存都会被返回,就好像它从来没有被销毁过一样。它只是将众多事件中的一个特定事件发送到进程以供其处理。如果进程没有正确地处理它,那么过一段时间操作系统就会出现并强制“清理”它。

它(终止)不会立即发生,因为子进程(甚至是父进程)可能已经将某些内容写入磁盘并等待I/O完成,或者正在执行其他一些可能损害系统稳定性或文件完整性的关键任务。

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8533377

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档