![]() |
谦和的移动电源 · GAN正常的loss曲线 - CSDN文库· 6 月前 · |
![]() |
不拘小节的酸菜鱼 · python ...· 8 月前 · |
![]() |
千年单身的围巾 · asp.net mvc 4 - ...· 1 年前 · |
![]() |
不羁的投影仪 · 线程安全:局部静态变量的初始化 - ...· 1 年前 · |
![]() |
讲道义的松树 · C++的static线程安全的实现细节是什么 ...· 1 年前 · |
有人告诉我,当你在linux中杀死父进程时,子进程就会死掉。
但我对此表示怀疑。因此,我编写了两个bash脚本,
father.sh
将在其中调用
child.sh
下面是我的脚本:
现在我运行
bash father.sh
,你可以检查它
ps -alf
然后我用
kill -9 24588
杀死了
father.sh
,我猜测子进程应该被终止,但不幸的是我错了。
有谁能解释一下原因吗?
thx
不,当你单独杀死一个进程时,它不会杀死子进程。
如果希望给定组的所有进程都接收信号,则必须将信号发送到进程组
例如,如果您的父进程id的代码为1234,则必须指定parentpid加上符号减号,后跟您的父进程id:
kill -9 -1234
否则,孤儿将被链接到
init
,如您的第三个屏幕截图所示(孩子的PPID已变为1)。
pkill -TERM -P <ProcessID>
这将杀死父级和子级
一般来说,杀死父母也会杀死孩子。
你看到孩子在杀死父亲后仍然活着的原因是因为孩子只会在它“选择”(内核选择)来处理SIGKILL事件之后死亡。它不需要立即处理它。您的脚本正在运行一个sleep()命令(即在内核中),该命令在休眠完成之前不会被唤醒来处理任何事件。
为什么PPID #1?父进程已终止,不再位于进程表中。child.sh现在没有莫名其妙地与init联系在一起。它根本没有运行的父进程。说它链接到init会产生这样的印象:如果我们以某种方式离开init,那么init就可以控制关闭进程。它还会造成这样的印象,即杀死父母会让祖父母成为孩子的主人。并不是两个都是真的。该子进程仍然存在于进程表中,并且正在运行,但是在它处理SIGKILL之前,不会处理基于它的进程ID的新事件。这意味着这个孩子是一个前僵尸,行尸走肉,有被贴上标签的危险。
进程组中的Killing是不同的,用来通过进程组#杀死同级和父级。同样重要的是要注意,“杀死一个进程”本身并不是“杀死”,在人类的方式中,你希望进程被销毁,所有内存都会被返回,就好像它从来没有被销毁过一样。它只是将众多事件中的一个特定事件发送到进程以供其处理。如果进程没有正确地处理它,那么过一段时间操作系统就会出现并强制“清理”它。
它(终止)不会立即发生,因为子进程(甚至是父进程)可能已经将某些内容写入磁盘并等待I/O完成,或者正在执行其他一些可能损害系统稳定性或文件完整性的关键任务。
Copyright © 2013 - 2023 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号: 粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
扫码关注腾讯云开发者
领取腾讯云代金券
![]() |
谦和的移动电源 · GAN正常的loss曲线 - CSDN文库 6 月前 |