概述
jinkins自动部署时,在linux下使用grep查询获取具体应用的进程id时,但是其中一个应用使用同样的命令死活获取不到进程id。
环境
centos7
问题
使用shell脚本获取应用进程id出错,具体脚本为
SERVICE_NAME=ookingrepa.jar
SERVICE_ID=`ps -ef | grep ${SERVICE_NAME} | grep -v grep | awk '{print $2}'`
echo ${SERVICE_ID}
if test -z ${SERVICE_ID}
then
echo "服务没有启动!"
else
echo "准备关闭当前服务的进程"
kill -9 ${SERVICE_ID}
fi
但是在jenkins自动部署时,总是找不到进程id,打出的日志总是为“服务没有启动”,但是在启动时又报端口已经被占用。真的是很恼火。
问题定位过程
-
考虑到应用打包是不是有问题,把应用重新手动打包,发到服务器上看,结果启动仍然如此,再三查看打包过程与jar包依赖都没有问题。
-
把jenkins中的部署脚本拿到服务器上执行,各种查找命令是否有错,各种百度命令,仍然么有确定问题;
-
把一个关键的命令拿出来单独执行,这句就是
-
ps -ef | grep ${SERVICE_NAME} | grep -v grep | awk '{print $2}'
-
分为两步走。
-
先查ps -ef | grep ${SERVICE_NAME}这部分是可以查到的,
-
再查ps -ef | grep ${SERVICE_NAME} | grep -v grep这部分,就查不到进程了。那么问题就在这句了。再三仔细查看后,发现SERVICE_NAME中含有grep字符串。本来想忽略grep的自身线程,但是它模糊匹配到服务名称中的grep,同时也忽略了。问题就是这么坑。。。。。。
-
名称必须单独出来,加粗关键地方才能看的出来。SERVICE_NAME=ookingrepa.jar
解决办法
办法有两种:
1、修改脚本中查询线程的方式按照正则表达式去查询,如下ps -ef | grep ${SERVICE_NAME} | grep [o]okin
;使用上述命令就可以grep自身的线程id。
2、修改Java应用的名称,让它在名称中不含grep。
最终选择第二种,为了与其他jenkins应用部署的脚本统一,避免后期维护踩同样的坑。
参考博文
http://blog.chinaunix.net/uid-21142030-id-3123647.html