linux杀掉所有子进程,linux 如何杀掉子进程树

killall -g 貌似会杀整个group,父进程也得玩完,所以可能需要自定义一下。

下面讲解一下实验的几个脚本。所有文件 p1.sh, p2.sh, p3.sh, killtree.sh

全部放当前目录下,然后 sh p1.sh 开始执行。

首先我们有脚本P1,只干一件事,启动P2,并等待P2结束:

#!/bin/sh

NAME=P1

echo "$NAME: begin"

sh ./p2.sh

echo "$NAME: end"

然后P2稍微复杂一些,启动P3和P4,记录P3和P4的pid,然后P2继续干自己的事情,P2

干完自己的事情以后,杀掉P3和P4,再退出。这里要考虑P3和P4自己也会有子进程,所

以要杀P3、P4及其子进程,但是不能把P1给杀了。所以杀P3和P4的时候,用了一个自定

义的脚本“killtree.sh”,这个脚本在最后。

#!/bin/sh

NAME=P2

echo "$NAME: begin"

sh ./p3.sh p3 &

p3=$!

sh ./p3.sh p4 &

p4=$!

echo "$NAME: fork done"

sleep 6

echo "$NAME: killing P3 $p3 and P4 $p4"

./killtree.sh $p3

./killtree.sh $p4

echo "$NAME: end"

P3和P4方便起见,用同一个脚本,并且就是睡觉:

#!/bin/sh

NAME=${1:?No name}

echo "$NAME: begin"

n=1

while [ x ]; do

echo "$NAME: running - $n"

n=$((n + 1))

sleep 2

done

# Never reached

echo "$NAME: end"

最后是杀进程X及X的子进程但是不伤及X的父进程的脚本 killtree.sh,从

stackoverflow 抄袭修改得来:

http://stackoverflow.com/questions/392022/best-way-to-kill-all-child-processes/

#!/bin/sh

if [ $(uname) != Linux ]; then

echo "I can only be run on Linux"

exit 127

fi

killtree() {

local _pid=$1

local _sig=${2:-TERM}

local _indent="${3:- }"

local _children="$(ps -o pid --no-headers --ppid ${_pid})"

echo "${_indent}kill ${_pid} with signal ${_sig}"

kill -${_sig} ${_pid}

sleep .5

if kill -0 ${_pid} 2>/dev/null; then

echo "${_indent}${_pid} still present, kill with -KILL"

# Update children list

_children="$(ps -o pid --no-headers --ppid ${_pid})"

kill -KILL ${_pid}

fi

for _child in ${_children}; do

killtree ${_child} ${_sig} "${_indent} "

done

}

if [ $# -eq 0 -o $# -gt 2 ]; then

echo "Usage: ${0##*/}  [signal]"

exit 1

fi

o_pid="$1"

o_sig=TERM

if [ -n "$2" ]; then

o_sig="$2"

fi

echo "killtree $o_pid"

killtree "$o_pid" "$o_sig" " "

【 在 IntMain (Init) 的大作中提到: 】

: 一个进程p1 fork()出一个子进程p2, p2又调用一个程序叫p3, p3又执行一个脚本产生进程p4,

: 那如何在p2结束时,把p3,p4 都杀掉。

: 补充:只是杀掉p2,p3,p4 保留p1

: ...................

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值