Shell 脚本程序往往会创建很多进程,当出现问题或者想终止执行的时候很麻烦,有时候忘记kill子进程,会出现一些很诡异的情况(如子进程需要写文件)。写个脚本kill进程树,方便以后系统维护使用。
#!/bin/sh
if [ $# -ne 1 ]
then
echo -e "\033[;36mUsage:\033[0m" "\033[;32mkillall\033[0m" "\033[;33mPID\033[0m"
exit
else
root=$1
fi
function treekill()
{
local father=$1
# children
childs=(`ps -ef | awk -v father=$father 'BEGIN{ ORS=" "; } $3==father{ print $2; }'`)
if [ ${#childs[@]} -ne 0 ]
then
for child in ${childs[*]}
do
treekill $child
done
fi
# father
echo -e "\033[;32mkill\033[0m" "\033[;36mpid\033[0m" "\033[;33m$father\033[0m"
kill -9 $father
}
treekill $root
测试一下:
test.sh 如下
#!/bin/sh
sh ./test1.sh &
sleep 55555555 &
sleep 7777777
test1.sh 如下
#!/bin/sh
sleep 55555555 &
sleep 7777777
运行
sh test.sh &
killtree pid # test.sh 的进程ID