shutdown 脚本使用 jps 查找关闭不了进程问题分析

126 阅读1分钟

背景

今天碰到一个抽风的脚本,某项目现场反映了一个问题:「应用的重启脚本反复重启时,有很多后台进程没有 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

启示录

看了其他两个开源软件用的命令:

  1. naocos:pgrep -f nacos.nacos
  2. Kafka:ps -A -o pid,jobname,comm | grep -i $JOBNAME | grep java | grep -v grep | awk '{print $1}'

结论:jps 查找进程确实会出现进程找不到的情况,还是用操作系统的进程查找命令 ps 比较靠谱。