在 linux中如何结束由一个父进程产生的所有子进程

2024-12-04 23:53:51
推荐回答(5个)
回答1:

父进程未结束,子进程先结束,会产生僵尸进程。
子进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁,而是留下一个称为僵尸进程(Zombie)的数据结构(系统调用 exit,它的作用是使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销毁)。
即使是root身份kill -9也不能杀死僵尸进程。补救办法是杀死僵尸进程的父进程(僵尸进程的父进程必然存在),僵尸进程成为"孤儿进程",过继给1号进程init,init始终会负责清理僵尸进程。
僵尸进程的避免:
(1) 父进程通过wait和waitpid等函数等待子进程结束,这会导致父进程挂起。
(2) 如果父进程很忙,那么可以用signal函数为SIGCHLD安装handler,因为子进程结束后, 父
进程会收到该信号,可以在handler中调用wait回收。
(3) 如果父进程不关心子进程什么时候结束,那么可以用signal(SIGCHLD, SIG_IGN) 通知内
核,自己对子进程的结束不感兴趣,那么子进程结束后,内核会回收, 并不再给父进程发送
信号。
(4) 还有一些技巧,就是fork两次,父进程fork一个子进程,然后继续工作,子进程fork一 个孙进
程后退出,那么孙进程被init接管,孙进程结束后, init会回收。不过子进程的回收 还要自己
做。
建议你使用第三种方法,父进程直接忽略子进程的结束,留给内核作回收处理。这样就不
会产生僵尸进程。

回答2:

LInux 父进程关闭子进程

回答3:

采用ps + grep + awk + pkill命令组合,可实现“结束由一个父进程产生的所有子进程”,如:

父进程名为 parent_proc,可先根据进程名称,得到进程PID

ps -ef |grep parent_proc|egrep -v grep | awk '{print $2}'

根据父进程PID终止所有子进程PID,保留父进程

pkill -9 -P $p_pid

完整脚本:

for p_pid in `ps -ef |grep parent_proc|egrep -v grep | awk '{print $2}'`
do
    pkill -9 -P $p_pid
done

有关各命令的详情介绍请查阅相关参考资料。

回答4:

killall命令杀死同一进程组内的所有进程。它要指定要终止的进程的名称,而非PID。

回答5:

pkill -a