平时写shell一不小心来个死循环,或是超长等待,需要先进程,再kill,懒人写个脚本。
第一种,适用于脚本(当然如果知道服务名也可以),通过ps列出进程号(过滤的pid是1列3行),循环结束所有进程号
#!/bin/bash
r#!/bin/bash
read -p "输入要结束的脚本或服务名称:" NAME
WC=$(ps -ef | grep $NAME |grep -v grep | wc -l)
#判断进程是否存在
if [ $WC -eq 0 ];then
echo "$NAME 不存在"
else
PID=$(ps -ef | grep $NAME |grep -v grep )
echo "========================== $NAME 相关进程信息========================="
echo "$PID"
echo "====================================================================="
#确认是否结束进程
echo -e "\033[32m y 结束$NAME相关进程 \033[0m"
echo -e "\033[32m n或按任意键退出\033[0m"
read -p "请输入(默认n):" NN
case $NN in
yes|YES|y|Y)
i=1
while [ $i -le $WC ]
do
kill -9 $( ps -ef |grep $NAME |grep -v grep| awk '{print $2}'|head -n$i|tail -n1 ) > /dev/null 2>&1
let i++
done
echo -e "\033[31m $NAME 相关进程结束 \033[0m"
;;
*)
exit
;;
esac
fi
第二种,适用于服务,通过pidof列出服务所有的进程号(过滤的pid是1行3列),循环结束所有进程号。
#!/bin/bash
read -p "输入要结束的服务名称:" NAME
WC=$(pidof $NAME | wc -w)
#判断进程是否存在
if [ $WC -eq 0 ];then
echo "$NAME 不存在"
else
PID=$(pidof $NAME)
echo "进程号:"
echo "$PID"
i=1
while [ $i -le $WC ]
do
kill -9 $( pidof $NAME|awk '{print $i}' ) > /dev/null 2>&1
let i++
done
echo "$NAME 相关进程结束"
fi
kill -9 可能会打印错误信息,需要null(譬如先结束了保护进程)
发表评论