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

作者&投稿:语颜 (若有异议请与网页底部的电邮联系)
在 linux中如何结束由一个父进程产生的所有子进程~

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

你是程序中调用kill函数,还是在命令行调用kill命令?
int kill(pid_t pid, int sig); 函数有两个参数,一个是进程号,一个是信号
如果你输入的进程号是正确的,而进程还在,则信号有可能被该进程忽略了,不知道你发送的信号是几号? 只有SIGKILL SIGSTOP不能被忽略,其它都可以忽略或捕捉。

父进程未结束,子进程先结束,会产生僵尸进程。
子进程在调用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会回收。不过子进程的回收 还要自己
做。
建议你使用第三种方法,父进程直接忽略子进程的结束,留给内核作回收处理。这样就不
会产生僵尸进程。

LInux 父进程关闭子进程



采用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

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



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

pkill -a


金堂县15077659888: 在 linux中如何结束由一个父进程产生的所有子进程 -
帅爬特拉: 采用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有关各命令的详情介绍请查阅相关参考资料.

金堂县15077659888: Linux 下如何结束指定进程 -
帅爬特拉: 一般linux使用kill来结束进程 Linux中的kill命令用来终止指定的进程(terminate a process)的运行,是Linux下进程管理的常用命令.通常,终止一个前台进程可以使用Ctrl+C键,但是,对于一个后台进程就须用kill命令来终止,我们就需要先使用...

金堂县15077659888: Linux C中父进程退出时,使用什么方法可使子进程退出 -
帅爬特拉: 可以用wait( ) 或者 waitpid( ) 阻塞父进程,等待子进程自己退出后给子进程收尸; 或者在子进程中注册一个信号响应,响应动作为退出进程,然后在父进程要退出时,给子进程发送信号,然后等待子进程退出后收尸. 相关API:wait( )signal( )exit( )

金堂县15077659888: linux C 如何实现子进程退出时父进程也退出? -
帅爬特拉: 理论上可以用信号.但是,没办法做到子进程退出同一时间父进程退出.必须父进程有调用检测.

金堂县15077659888: C语言在linux如何让子进程不继承父进程的资源 -
帅爬特拉: 我觉得这个问题你应该从另外一个方向去考虑,既然B不需要A的资源,那么就不要在fork之前打开这些资源.你如,你原来的代码是 fd = open(...);......fork();......你现在就应该改成 fork(); if (parent) { ...... fd = open(); .....} else { ....} 如果你是要在...

金堂县15077659888: 求助:Linux或Unix系统下,怎样删除父进程为1的僵尸进程,前提是不能重启机器. -
帅爬特拉: 进程1是init,系统启动最先进驻内存的守护进程,其它所有进程都是INIT的子进程!想不重启KILL 1 是可以的,后果比重启还严重.

金堂县15077659888: linux shell脚本怎么写,才能实现关闭父进程的时候同时关闭子进程 -
帅爬特拉: 你的想法实现不了 父进程调用外部脚本,产生一个新的子进程,子进程可以基础父进程的环境变量,但是子进程的后续执行,不会影响父进程的环境 所以你想通过父来找子,shell下是找不到的 方法1、改脚本,把外部脚本放到A脚本中,不要调用了 方法2、kill 的时候 扫描两个脚本的进程名,发现后,分别kill

金堂县15077659888: linux中如何更改程序的父进程 -
帅爬特拉: 当父进程比子进程先结束时,linux内核会为子进程完成“寻父”过程,一般是把init(pid=1)进程当作子进程的父进程(就是设置子进程的ppid为1),最后子进程结束时,init进程负责wait子进程(释放子进程的task_struct结构体),手动更改好像不行的吧.

金堂县15077659888: linux如何杀死PPID为1的进程? -
帅爬特拉: 某一个进程在结束时由它的父进程负责删除它.要找到某一个进程的父进程,执行ps -ef命令,输出中的PPID列给出了一个进程的父进程的进程号. (1)如果PPID为1应该如何做? 如果一个defunct进程的PPID为1,则该defunct进程的父进程为init...

金堂县15077659888: LINUX里,父进程退出了,子进程一定会退出吗? -
帅爬特拉: 不. 若父进程退出,子进程尚未结束,则子进程会被init进程领养,也就是说init进程将成为该子进程的父进程. 若希望父进程退出,子进程也退出的话,可以使用线程,因为若进程结束,则还没结束的线程一定会立刻结束.或者如楼上所说,用信号,用atexit注册一个退出时执行的函数,这个函数中发送信号给子进程即可.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网