linux下grep的坑

概述

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,打出的日志总是为“服务没有启动”,但是在启动时又报端口已经被占用。真的是很恼火。

问题定位过程

  1. 考虑到应用打包是不是有问题,把应用重新手动打包,发到服务器上看,结果启动仍然如此,再三查看打包过程与jar包依赖都没有问题。

  2. 把jenkins中的部署脚本拿到服务器上执行,各种查找命令是否有错,各种百度命令,仍然么有确定问题;

  3. 把一个关键的命令拿出来单独执行,这句就是

  4. ps -ef | grep ${SERVICE_NAME} | grep -v grep | awk '{print $2}'

  5. 分为两步走。

  6. 先查ps -ef | grep ${SERVICE_NAME}这部分是可以查到的,

  7. 再查ps -ef | grep ${SERVICE_NAME} | grep -v grep这部分,就查不到进程了。那么问题就在这句了。再三仔细查看后,发现SERVICE_NAME中含有grep字符串。本来想忽略grep的自身线程,但是它模糊匹配到服务名称中的grep,同时也忽略了。问题就是这么坑。。。。。。

  8. 名称必须单独出来,加粗关键地方才能看的出来。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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值