shell脚本学习之springboot jar包简单部署
前言
很早就接触了linux系统,然后也习惯了使用命令行。我也知道shell很强大,这次就这springboot jar包简单部署,涨涨姿势。
简单知识点
写完的脚本文件,记得添加执行权限: chmod +x xxxx.sh
执行脚本命令: sh xxx.sh
-
要加很多空格,变量和符号之前,如下,如果在 中括号‘0’ 和 ‘]’ 之间没有空格,那么该语句报错,无法识别 0 这个参数
if [ $# -eq 0 ]; then usage fi
变量赋值时候 等号("=") 左右两边都不要留空格,否则脚本报错
查看指定端口(80)运行程序的进程pid命令:
netstat -nlp|grep :80|awk '{print $7}'|sed 's/\([0-9]*\).*/\1/g
'注意sed 、awk、grep 三个命令的区别和用法
-
if 语句中的一些参数:
[-z string] “string”的长度为零则为真
[-n string] or [string] “string”的长度为非零non-zero则为真
其他的参数,
read:命令行从输入设备读入内容
推荐给使用的变量都添加花括号,这是个好习惯,比如 echo "I am good at ${skill}"
-
一些特殊变量
变量 含义 $0
当前脚本的文件名 $n
传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是 $1
,第二个参数是$2
。$#
传递给脚本或函数的参数个数。 $*
传递给脚本或函数的所有参数。 $@
传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $*
稍有不同$?
上个命令的退出状态,或函数的返回值。 $$
当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。
- shell默认是不处理转义的字符的。需要加
-e
选项。比如 echo -e "hello \n world"(是在脚本中,不是在命令行中直接输入) - shell本身不支持算数运算,所以使用
expr
命令进行自增
#!/bin/bash
c=0;
while [ $c -lt 3 ]
do
echo "Value c is $c"
# 执行命令,需要用 `` 包起来。在 esc 键位边山
c=`expr $c + 1`
done
Shell 函数必须先定义后使用
直接从终端调用函数,可以将函数定义在主目录下的 .profile 文件,这样每次登录后,在命令提示符后面输入函数名字就可以立即调用
不希望文件内容被覆盖,可以使用
>>
追加到文件末尾 eg:echo line 2 >> users
awk 中,
~
表示使用正则匹配,!~
表示不匹配正则表达式;eg:awk '$2~/(1990|1991)/{print $1}' s.txt
linux 命令行文本工具
sed 命令
-
行内部分内容替换,这个用的最多了
sed 's/要被取代的字串/新的字串/g'
替换规则范例
s/\t/","/g; \t换成","
s/^/"/; 开头加上"
s/$/"/;s/\n//g 末尾加上"
s/"//g; 引号去掉
s/,/ /g 逗号换成空格
s/,/\n/g 逗号换成空行
s/[NULL]//g; NULL换成空白
s/[,,]/\n/g 中英文逗号换成空行
掌握之后,事半功倍
xargs 命令
由于很多命令不支持|
管道来传递参数,而日常工作中有有这个必要,所以就有了xargs
命令,例如:
find /sbin -perm +700 | ls -l #这个命令是错误的
find /sbin -perm +700 | xargs ls -l #这样才是正确的
cat picurl.csv | grep -E -o "http://www.test.com(.*?).jpg" | xargs wget -c
最后
学习过程中,参杂了其他知识,顺手就记下来了。
贴上最终脚本,很大部分参考他的博客
#!/bin/bash
usage() {
echo "食用方式:sh yourshellname.sh [jar包名] [start|stop|restart] [env]"
echo "jar包代号"
echo '1:dwcm-api 2:dwcm-web 3:dwcm-wx 4:dwcm-openApi 5:dwcm-coupon 6:dwcm-dispatcher'
echo "7:wes-api 8:wes-dispatcher 9:wes-manager wes-wx"
exit 1
}
## 判断参数个是为 0 个,$# 表示用户输入的参数个数
if [ $# -eq 0 ]; then
usage
fi
### 获取所有的参数
PROJECT_NAME=""
EXCUTE_TYPE=""
PROJECT_ENV=""
CODE=0
echo "开始参数处理"
while getopts "n:a:m:" opt; do
case $opt in
n)
CODE=$OPTARG
;;
a)
EXCUTE_TYPE=$OPTARG
;;
m)
PROJECT_ENV=$OPTARG
;;
*)
echo "不支持参数和选项"
;;
esac
done
########### 包名处理
if [ $CODE == 1 ]; then
PROJECT_NAME='dwcm-api.jar'
elif [ $CODE == 2 ]; then
PROJECT_NAME="dwcm-web.jar"
elif [ $CODE == 3 ]; then
PROJECT_NAME="dwcm-wx.jar"
elif [ $CODE == 4 ]; then
PROJECT_NAME="dwcm-openApi.jar"
elif [ $CODE == 5 ]; then
PROJECT_NAME="dwcm-coupon.jar"
elif [ $CODE == 6 ]; then
PROJECT_NAME="dwcm-dispatcher.jar"
elif [ $CODE == 7 ]; then
PROJECT_NAME="wes-api.jar"
elif [ $CODE == 8 ]; then
PROJECT_NAME="wes-dispatcher.jar"
elif [ $CODE == 9 ]; then
PROJECT_NAME="wes-manager.jar"
elif [ $CODE == 10 ]; then
PROJECT_NAME="wes-wx.jar"
else
echo "请选择对应的程序执行"
exit 1
fi
##### 执行的操作类型
if [ ! $EXCUTE_TYPE ]; then
echo "执行类型 [start|stop|restart] IS NULL"
exit 1
fi
if [ "$RPOJECT_ENV" = "" ]; then
echo "没有指定运行的profile,将使用打包时默认的profile"
fi
echo "----------------------------------------------------"
echo "使用的参数"
echo "应用jar包名:$PROJECT_NAME"
echo "脚本行为:$EXCUTE_TYPE"
echo "环境:$PROJECT_ENV"
echo "-------------------参数处理完成-------------------- "
### 以上参数接受区域 #######
echo "开始检测进程"
##### #查询$PROCESS_PID进程个数:wc -l 返回行数
CURRENT_PROCESS_COUNT=$(ps -ef | grep $PROJECT_NAME | grep $PROJECT_NAME | grep -v "grep" | wc -l)
echo "当前运行 $PROJECT_NAME 的进程个数为 $CURRENT_PROCESS_COUNT"
CURRENT_PROCESS_PID=$(ps -ef | grep $PROJECT_NAME | grep $PROJECT_NAME | grep -v "grep" | awk '{print $2}')
echo "当前运行 $PROJECT_NAME 的进程ID-->"$CURRENT_PROCESS_PID
#### 启动方法
start() {
echo '-----------------------开始启动服务----------------------'
if [ -n "$CURRENT_PROCESS_PID" ]; then
echo "服务名称: $PROJECT_NAME,进程号为:$CURRENT_PROCESS_PID 服务正在运行"
echo "本次执行启动失败"
exit 1
fi
echo -n "开始启动 $PROJECT_NAME"
nohup java -jar $PROJECT_NAME --spring.profiles.active=$PROJECT_ENV >/dev/null 2>&1 &
for st in $(seq 1 20); do
# 根据app名称,获取 pid
PID=$(ps -ef | grep $PROJECT_NAME | grep $PROJECT_NAME | grep -v "grep" | awk '{print $2}')
# 计数到20,并且依然没有获取到app 的进程,那此次启动判定为失败
if [ $st -eq 20 ] && [ -z "$PID"]; then
echo "服务启动失败"
break
fi
if [ -z "$PID"]; then
sleep 3
echo $st"服务启动中....."
else
echo "服务启动完成,进程ID为 $PID,耗时: $(($((st - 1)) * 3)) 秒"
break
fi
done
}
stop() {
echo "开始执行停止服务命令"
if [ -z "$CURRENT_PROCESS_PID" ]; then
echo "没有找到该服务的进程,请确认该服务是否启动"
else
kill -9 $CURRENT_PROCESS_PID
echo "服务器已停止"
fi
}
status() {
if [ -z "$CURRENT_PROCESS_PID" ]; then
echo "没有找到该服务的进程"
else
echo "运行服务名称:$PROJECT_NAME"
echo "运行的进程id; $CURRENT_PROCESS_PID"
fi
}
restart() {
stop
start
}
case "$EXCUTE_TYPE" in
"start")
echo "------------------start--------------------"
start
;;
"stop")
echo "------------------stop--------------------"
stop
;;
"restart")
restart
;;
"status")
echo "------------------status--------------------"
status
;;
*)
usage
;;
esac