本文接上一篇,上一篇配置构建完maven项目并发送到远程服务器启动微服务后,如果再次发布,虽然没报错,但是看进程id还是原来的进程。说明原有的项目不会被停止,新发布的没有生效。
所以需要jenkins中配置shell语句先杀死进程。
网上搜jenkins主动杀死进程并重启项目的方法,所有结果都是关于构建后杀死了进程什么的垃圾答案,只有一个正确答案是这个:https://blog.csdn.net/panyueke/article/details/107175087
BUILD_ID=dontKillMe cd /home/XXX git pull PIDS=`ps -ef|grep loko.py |grep python3 | awk '{print $2}'` for pid in $PIDS;do kill -9 $pid;done nohup python3 loko.py &
该语法含义是:查询含有loky.py且含有python3的进程,将结果保存在PIDS中,然后遍历PIDS,将每一项杀死。
其中awk命令的含义是:https://www.runoob.com/linux/linux-comm-awk.html
这个方法本身没有错,但怎奈我对于这些语法不熟悉,导致执行后发现有错误信息。
其实代码本身没错,是该方法输出了额外的查询结果,导致杀死进程时提示某个进程不存在。
立马我就想到是查询结果里带了搜索进程的pid(如下--color=auto行):
于是开始找解决方案,
思路一:如何不输出搜索进程的行。
思路二:直接查找linux杀死多个进程的方法。
其实这两种方式都没有找到理想的答案,最后想起之前保存的一条jenkins杀死进程的语句(其实该语法是思路二),于是找出来重新认真学习。
ps -ef|grep test.jar|grep -v grep|cut -c 9-15|xargs kill -9
该语句的含义是:查找所有包含test.jar的进程(且不含grep),从每行结果中截取10-15号字符,然后将结果对应的进程杀死。
分析其中的每一步命令:
ps:https://www.runoob.com/linux/linux-comm-ps.html
grep -v grep:https://blog.csdn.net/dieyong/article/details/93008252
cut:这个没有查找资料,自己从输出结果分析是取行号10-15字符。
xargs:https://www.runoob.com/linux/linux-comm-xargs.html
该方法之前测试失败,所以后来没有使用,其实该语句并没有错误,只是在进程不存在时会提示帮助信息,导致停止后续的操作。
此时上面提到的思路一也明了了,就是用grep -v grep 隐藏额外的搜索进程。
但这时忽然灵光一闪,看起来cut -c 9-15这个结果有瑕疵啊,先不说有没有超过6位的进程id,就5位的进程id前后空格也不够完美,如果跟上面提到的akw '{print $2}'结合不就完美了吗。
经测试执行结果跟上面cut的一致,但是进程不存在时输出的异常(帮助)信息也一致。。。
查资料发现原来是批量杀死进程当进程不存在时会直接提示帮助语法信息。
而解决思路就是判断进程是否为空,具体为是否空字符。所以需要用到if语句。
if语法为:
if 你的条件判断; then fi
但是按照网上说的判断条件左右加中括号[]后报错:unary operator expected,又查找答案说要加双层中括号[[ ]],该方法并没有解决我的问题:https://blog.csdn.net/whatday/article/details/103897163
查看错误输出,用比较字符是否相等的判断语句不行,即使给变量加单引号也不行,最后直接换成判断字符长度(-n 变量)解决。
关于if [-n] 的用法:https://www.cnblogs.com/ariclee/p/6137456.html
最终的解决方案:
方案一:
BUILD_ID=dontKillMe PIDS=`ps -ef | grep test.jar | grep -v grep | awk '{print $2}'` if [ -n "$PIDS" ]; then ps -ef | grep test.jar | grep -v grep | awk '{print $2}' | xargs kill -9 fi
方案二:
BUILD_ID=dontKillMe PIDS=`ps -ef | grep test.jar | grep -v grep | awk '{print $2}'` for pid in $PIDS;do kill -9 $pid;done