问题场景
最近一直在整基于flask
框架的python web服务。遇到的最重复性的问题就是:本地的代码测试完成,需要通过scp
命令将本地的文件上传到服务器。同时,服务器上旧文件需要做一个删除操作,终止原来的进程;再根据新代码启动服务。整个过程的描述如下:
- 关闭线上的服务
ps -ef | grep 'python3 app.py' | grep -v grep | awk '{print $2}' | xargs kill
- 删除路径下的文件
rm -rf /ocr/*
- 上传本地的文件
scp -r ./* root@xxx:/xxx/ xxxxxx
- 启动
看到这样繁琐的过程,我最终忍无可忍了, 决定写一个shell脚本彻底的根治这个问题。
解决方案
先看一下更新之后的流程:
可以看到关键点在于新的两个脚本:deploy.sh
和start.sh
。
start.sh
主要是封装的启动命令和启动检查,防止通过脚本启动服务时,服务已经是处于运行的状态。
echo "-----------------欢迎使用脚本,开始启动ocr, cmd:$0 $*---------------------"
WC=$(lsof -i:$SERVER_PORT | grep python | wc -l)
if [ $WC -gt 0 ]; then
echo "ocr服务启动失败,服务已启动或端口 $SERVER_PORT 被占用"
if [ $uname -eq 'Darwin' ]; then
PID=$(lsof -i:$SERVER_PORT | awk 'NR==2{print $2}')
echo '是否重启服务(y/n):'
read choice
else
PID=$(netstat -nlp | grep $SERVER_PORT | awk '{print $NF}' | cut -d '/' -f 1)
read -n 1 -t 30 -p '是否重启服务(y/n):' choice
fi
echo "查询的PID:$PID 你的选择:$choice"
if [ $choice == 'y' ]; then
kill -9 $PID
else
exit 1
fi
fi
deploy.sh
主要是文件的上传操作了。