背景
今天碰到一个抽风的脚本,某项目现场反映了一个问题:「应用的重启脚本反复重启时,有很多后台进程没有 kill 掉,导致每重启一次就增加一个同名的新进程。」
shutdown.sh 脚本很简单的呀,就是根据进程的关键字查找进程 ID,先 kill PID,再休眠10秒后强制kill 掉,排了半天终于找到问题的根本了。
问题分析
找了半个小时,反复比对停止脚本打印的进程 ID,我用发布的最新版本的脚本让运维同事查找进程,都发现不了问题。
尝试修改脚本打印进程 ID的时候,发现对方用的是 jps 查找进程 ID的,而我用的是 ps 查找进程,原来是 jps 查找的问题,而这个坑去年七月已经排查过了的。
ps 查找进程
改成用 ps 查找进程
pIDs=`ps -ef|MyApp|grep -v 'grep' |awk '{print $2}'`
if [ "$pIDs" = "" ]
then
echo "No process ...."
else
for var in ${pIDs[@]};
do
echo "kill -9 $var"
kill "$var"
done
fi
启示录
看了其他两个开源软件用的命令:
- naocos:
pgrep -f nacos.nacos - Kafka:
ps -A -o pid,jobname,comm | grep -i $JOBNAME | grep java | grep -v grep | awk '{print $1}'
结论:jps 查找进程确实会出现进程找不到的情况,还是用操作系统的进程查找命令 ps 比较靠谱。