背景

最近上了新的部署平台(内部开发的DevOps),在发布生产应用的时候,会通过DevOps触发服务器的部署脚本deploy.sh去执行启动的命令,在最近的一个迭代发布中,通过DevOps平台去发布应用,在服务器上却发现一些应用没有启动成功,进程被kill掉了

问题

检查发现,问题出在部署脚本deploy.sh上,出问题的脚本如下:

appId=$(ps -ef|grep java|grep ${appName}|awk '{print $2}')
if[[ ${appID} !="" ]];then
echo "1.停止应用:${appName},对应的进程ID为:${appId}!"
kill -9 ${appId}复制代码

上面的脚本逻辑很简单,应用名appName通过DevOps平台传入,根据appName查找进程appId,然后通过kill -9杀进程,看起来没有任何问题.

问题分析

在尝试了两次通过部署平台启动无效后,排查问题,发现此次发布的版本中包含一个名为file的服务,那么此时file作为appName传入,在查找file应用进程时,把所有启动命令中使用spring.profiles.active来区分配置的应用进程也都查来出来,关键字file别包含在了profiles中!!!,这就导致了在发布应用file时,kill -9 ${appId}会把查出来的进程都杀掉......记一次生产部署脚本的五杀(误杀)_部署

解决方案

这个问题在于使用ps命令查询进程号的时候没有过滤掉其它进程,所以解决方案在于优化appName的值,使其区分度足够区分不同进程名,可以使用进程的全路径名,也可以修改为.file.jar.,在原来file的基础上加上.jar后缀名,再在前后加上空格进行区分记一次生产部署脚本的五杀(误杀)_部署_02