shell脚本递归查杀子进程与僵尸进程
时间:2015-02-07 20:43 来源:linux.it.net.cn 作者:IT
shell脚本查杀子进程、僵尸进程,递归找到导致进程僵死的最底层子进程并杀除。
对于大量的僵尸进程,最初写了一个根据关键字查杀进程的linux shell脚本,很多时候进程死在那里,其实是内部调用子进程出现了问题,只靠杀父进程根本没解决根本问题。
比如说rsync的时候通过ssh来连接,rsync本身没问题,但可能ssh死掉了。
因此重新写了脚本,递归查找子进程。
shell脚本:
#!/bin/sh
# 递归找到导致进程僵死的最底层子进程并杀除.
ParentProcessID=$1;
if [ "x${ParentProcessID}" = "x" ] ; then
echo "Please Supply the top Parent Process ID to be killed!"
echo "Usage:sh $0 PID [-v]"
echo "PID The Parent Process ID as root"
echo "-v is this argument supplied,no real kill operation will be performed,only process tree be show."
exit 1
fi
let IsRealKillDo=1;
if [ "x$2" = "x-v" ] ; then
let IsRealKillDo=0;
fi
echo "Begin Kill the Leaf Process of process ${ParentProcessID}" >&2
killpidList=""
function loopNextSubProcess(){
local nParentProcessID=$1
local tmpPidList=""
tmpPidList=`ps -A --format='%p%PisParent' --width 2048 -w --sort pid|grep "${nParentProcessID}isParent"|grep -v grep|grep -v "$$" | awk '{ printf $1 }'`
ps --format='%p%P%a' --width 2048 -w -p ${nParentProcessID}|grep -v grep|grep -v "$$" >&2
if [ "x${tmpPidList}" = "x" ] ; then
echo "****Got One Leaf = [${nParentProcessID}]****" >&2
killpidList="${killpidList}\n${nParentProcessID}"
return
fi
for theNextPid in ${tmpPidList} ; do
loopNextSubProcess ${theNextPid}
done
}
loopNextSubProcess ${ParentProcessID}
if [ ${IsRealKillDo} -eq 1 -a "x${killpidList}" != "x" ] ; then
for curpid in `echo -e ${killpidList}` ; do
if [ "x${curpid}" != "x" ] ; then
echo "kill -9 ${curpid}"
kill -9 ${curpid}
fi
done
else
echo -e ${killpidList}
fi
(责任编辑:IT)
shell脚本查杀子进程、僵尸进程,递归找到导致进程僵死的最底层子进程并杀除。 对于大量的僵尸进程,最初写了一个根据关键字查杀进程的linux shell脚本,很多时候进程死在那里,其实是内部调用子进程出现了问题,只靠杀父进程根本没解决根本问题。 比如说rsync的时候通过ssh来连接,rsync本身没问题,但可能ssh死掉了。 因此重新写了脚本,递归查找子进程。
shell脚本:
#!/bin/sh
(责任编辑:IT)# 递归找到导致进程僵死的最底层子进程并杀除. ParentProcessID=$1; if [ "x${ParentProcessID}" = "x" ] ; then echo "Please Supply the top Parent Process ID to be killed!" echo "Usage:sh $0 PID [-v]" echo "PID The Parent Process ID as root" echo "-v is this argument supplied,no real kill operation will be performed,only process tree be show." exit 1 fi let IsRealKillDo=1; if [ "x$2" = "x-v" ] ; then let IsRealKillDo=0; fi echo "Begin Kill the Leaf Process of process ${ParentProcessID}" >&2 killpidList="" function loopNextSubProcess(){ local nParentProcessID=$1 local tmpPidList="" tmpPidList=`ps -A --format='%p%PisParent' --width 2048 -w --sort pid|grep "${nParentProcessID}isParent"|grep -v grep|grep -v "$$" | awk '{ printf $1 }'` ps --format='%p%P%a' --width 2048 -w -p ${nParentProcessID}|grep -v grep|grep -v "$$" >&2 if [ "x${tmpPidList}" = "x" ] ; then echo "****Got One Leaf = [${nParentProcessID}]****" >&2 killpidList="${killpidList}\n${nParentProcessID}" return fi for theNextPid in ${tmpPidList} ; do loopNextSubProcess ${theNextPid} done } loopNextSubProcess ${ParentProcessID} if [ ${IsRealKillDo} -eq 1 -a "x${killpidList}" != "x" ] ; then for curpid in `echo -e ${killpidList}` ; do if [ "x${curpid}" != "x" ] ; then echo "kill -9 ${curpid}" kill -9 ${curpid} fi done else echo -e ${killpidList} fi |