在 linux中如何结束由一个父进程产生的所有子进程
发布网友
发布时间:2022-04-19 22:43
我来回答
共5个回答
热心网友
时间:2024-06-01 19:44
父进程未结束,子进程先结束,会产生僵尸进程。
子进程在调用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会回收。不过子进程的回收 还要自己
做。
建议你使用第三种方法,父进程直接忽略子进程的结束,留给内核作回收处理。这样就不
会产生僵尸进程。
热心网友
时间:2024-06-01 19:39
killall命令杀死同一进程组内的所有进程。它要指定要终止的进程的名称,而非PID。
热心网友
时间:2024-06-01 19:38
pkill -a
热心网友
时间:2024-06-01 19:40
采用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
有关各命令的详情介绍请查阅相关参考资料。
热心网友
时间:2024-06-01 19:43
LInux 父进程关闭子进程