700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Java jar包部署运行shell脚本

Java jar包部署运行shell脚本

时间:2018-09-05 05:47:33

相关推荐

Java jar包部署运行shell脚本

#!/bin/sh#注意事项#Linux 命令大全 /linux/linux-command-manual.html#1.在linux中,&和&&,|和||介绍如下:#& 表示任务在后台执行,如要在后台运行redis-server,则有 redis-server &#&& 表示前一条命令执行成功时,才执行后一条命令 ,如 echo '1‘ && echo '2' #| 表示管道,上一条命令的输出,作为下一条命令参数,如 echo 'yes' | wc -l#|| 表示上一条命令执行失败后,才执行下一条命令,如 cat nofile || echo "fail"##2.shell一次性执行多条命令#2.1.每个命令之间用;隔开 说明:各命令的执行给果,不会影响其它命令的执行。换句话说,各个命令都会执行,但不保证每个命令都执行成功。#2.2.每个命令之间用&&隔开 说明:若前面的命令执行成功,才会去执行后面的命令。这样可以保证所有的命令执行完毕后,执行过程都是成功的。#2.3.每个命令之间用||隔开 说明:||是或的意思,只有前面的命令执行失败后才去执行下一条命令,直到执行成功一条命令为止。##3.linux shell 中判断文件、目录是否存在的方法 /article/186273.htm#判断运算 /linux/linux-shell-basic-operators.html#多个条件判断 if [ $1 ] || [ $2 ] ;if [ $1 ] && [ $2 ] #多个条件判断 if [ -n "$1" -o -n "$2" ] -o表示or ; if [ -n "$1" -a -n "$2" ] -a表示and 参数必须加”“#Shell 基础 -- 总结几种括号、引号的用法 /tongye/p/10646211.html##4.Shell中的$0、$1、$2、$(命令)的含义# $$ Shell本身的PID(ProcessID)# $! Shell最后运行的后台Process的PID# $? 最后运行的命令的结束代码(返回值)比如shell运行一个命令,然后你在敲入$?, 就会打印上个命令的执行结果,就是上个命令的返回结果)# $- 使用Set命令设定的Flag一览# $* 所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。# $@ 所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。# $# 添加到Shell的参数个数# $0 就是你写的shell脚本本身的名字,# $1 是你给你写的shell脚本传的第一个参数,# $2 是你给你写的shell脚本传的第二个参数# $(命令) 是执行括号内的命令 例如$(pwd) 返回当前目录# 示例:##!/bin/sh#echo "shell脚本本身的名字: $0"#echo "传给shell的第一个参数: $1"#echo "传给shell的第二个参数: $2"#保存退出后,你在Test.sh所在的目录下输入 bash Test.sh 1 2#结果为:#shell脚本本身的名字: Test.sh#传给shell的第一个参数: 1#传给shell的第二个参数: 2##5.执行cp或mv时,总是会提示overwrite,如何不提示呢?#在命令行输入alias或者打开~/.bashrc文件看linux中的别名#默认cp执行的是cp -i,所以每次用cp的时候都会显示cp: overwrite `.., 解决 可以在使用\cp sourcefile destfile 即命令前加\#同理 mv rm 等##6.shell脚本中cd命令无效的解决方法 source xxx.sh或者. ./xxx.sh注意前面. ./xxx.sh .和.中间有个空格!#fork例 ./xxx.sh新开一个子 Shell 执行,子 Shell 可以从父 Shell 继承环境变量,但是子 Shell 中的环境变量不会带回给父 Shell。#exec例 exec xxx.sh在同一个 Shell 内执行,但是父脚本中 exec 行之后的内容就不会再执行了#source例 source xxx.sh在同一个 Shell 中执行,在被调用的脚本中声明的变量和环境变量, 都可以在主脚本中进行获取和使用,相当于合并两个脚本在执行。#source方式的结果是两者在同一进程里运行。该方式相当于把两个脚本先合并再运行##7.shell脚本日志输出/linux/linux-shell-io-redirections.html#command < file将输入重定向到 file。#command > file将输出重定向到 file。#command >> file将输出以追加的方式重定向到 file。#/dev/null 如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null 例 command > /dev/null#如果希望屏蔽 stdout 和 stderr,可以这样写: command > /dev/null 2>&1#关于2>&1的含义:将标准错误输出重定向到标准输出;符号>&是一个整体,不可分开,分开后就不是上述含义了;写成2&>1也是不可以的#为什么2>&1一定要写到>log后面,才表示标准错误输出和标准输出都定向到log中? #不妨把1和2都理解是一个指针,然后来看上面的语句就是这样的:#本来1----->屏幕 (1指向屏幕)#执行>log后, 1----->log (1指向log)#执行2>&1后, 2----->1 (2指向1,而1指向log,因此2也指向了log)##8.linux命令tee:将信息同时输出到屏幕和文件 例 | tee -a ./xxx.log 2>&1 或 例 | tee -a xxx.log 2>&1 #-a 是为了追加日志追加输出,避免日志被覆盖##9.shell 也可以包含外部脚本 /linux/linux-shell-include-file.html 注:被包含的文件 test1.sh 不需要可执行权限。##10.给多个脚本赋权限 chmod a+x liqiang-2.sh liqiang-3.sh liqiang-4.sh 或者chmod a+x *.sh 或 chmod +x xxx.sh 或 chmod u+x xxx.sh #u 表示该文件的拥有者,g 表示与该文件的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。#+ 表示增加权限、- 表示取消权限、= 表示唯一设定权限。#r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该文件是个子目录或者该文件已经被设定过为可执行。#11.-bash: ./xxx.sh: /bin/sh^M: bad interpreter: No such file or directory 编码方式是windows编辑的,必须转化格式为unix格式 # 操作 vim xxx.sh 按ESC键,再次执行下面命令(冒号是命令) :set ff=unix 再 :x##12.外部执行shell脚本 第一步 source ./xxx.sh例 source ./xxx.sh# 第二步 方法名 参数1 参数2 例pull username password#13.外部执行shell脚本同时将日志信息输出到屏幕和文件 #方法名 参数1 参数2 | tee -a ./xxx.log 2>&1#例pull username password | tee -a ./pullcode.log 2>&1 #14.外部执行shell脚本的函数并同时将日志信息输出到屏幕和文件 #source xxx.sh && 方法 | tee -a ./xxx.log 2>&1#例source xxx.sh && pull | tee -a ./pull.log 2>&1#15.echo -e 参数#-e 若字符串中出现以下字符,则特别加以处理,而不会将它当成一般文字输出:# \a 发出警告声;# \b 删除前一个字符;# \c 最后不加上换行符号;# \f 换行但光标仍旧停留在原来的位置;# \n 换行且光标移至行首;# \r 光标移至行首,但不换行;# \t 插入tab;# \v 与\f相同;# \\ 插入\字符;# \nnn 插入nnn(八进制)所代表的ASCII字符;#在echo -e 后,对“\c” 的解释是:produce no further output 不产生进一步的输出 ----》自己理解是在\c 后,这一行后面的内容都不会输出#例echo -e ".\c" 只输出"."##16.shell获取当前工作目录绝对路径,最简单$(pwd)# 不行尝试 $(cd "$(dirname "$0")";pwd)##17.如何在vi和vim上查找字符串# 17.1 命令模式下,/要搜索的字符串或者字符 例如 输入/echo# 17.2 按下回车之后,可以看到vim已经把光标移动到该字符处和高亮了匹配的字符串(vi没高亮,因为它没有颜色)# 17.3 查看下一个匹配呢?按下n(小写n),一直按n到最后,红色的字提示BOTTOM(已经到底了,尽头了),说明匹配的字符串已经到此处是最后一个。再按n会回到TOP(第一个匹配成功的字符串)# 17.4 如何跳转到上一个匹配呢?按下N(大写N)。你可以按下Caps Lock键切换大小写,也可以在小写状态按下Shift + n# 17.5 如果想从文件的结尾往开始处搜索呢 命令模式下,?要搜索的字符串或者字符 例如 输入?echo#18 退出vi/vim# :w - 保存文件,不退出 vim# :w file -将修改另外保存到 file 中,不退出 vim# :w!-强制保存,不退出 vim# :wq-保存文件,退出 vim# :wq! -强制保存文件,退出 vim# :q -不保存文件,退出 vim# :q!-不保存文件,强制退出 vim# :e!-放弃所有修改,从上次保存文件开始再编辑###19 linux 清空文件内容命令# 1. > test.log# 2. cat /dev/null test.log# 3. echo "" >test.log##20.查看java进程pid#jps -l#21.根据pid查询java进程的启动时间#axo:选项#pid:进程id#comm:命令#pmen: 进程占用的内存#lstart: 进程启动时间#grep: 文本搜索#ps axo pid,ppid,comm,pmem,lstart | grep pid#例:392301 java 4.0 Sat Mar 12 13:28:50 #22 cat 追加内容用 >>,覆盖内容用 >#1.cat创建文件#格式:cat > 文件名 <<结束标记#或者直接用:cat >文件名#cat如果找不到文件,则直接创建文件,创建了文件,输入内容最后Ctrl + C退出。#例1 cat > 1.txt 回车 输入内容 最后Ctrl + C退出#例2 以D作为结束标记 输入内容 最后以D结束输入#cat > 1.txt <<D#123#D#2.cat文件追加#格式:cat >> 文件名 <<结束标记#例1 cat >> 1.txt 回车 输入内容 最后Ctrl + C退出#例2 以D作为结束标记 输入内容 最后以D结束输入#cat >> 1.txt <<D#123#D#3.cat文件清空#清空文件内容,可以直接输入结束标记,这样便向文件中写入0字符,文件即被清空了。#例1 直接输入结束标记,向文件中写入0字符#cat > 1.txt <<D#D#4.以EOF作为结束标记#cat <<EOF和cat <<-EOF两个都是获取stdin,并在EOF处结束stdin,输出stdout。#<<和<<-的区别#<<:结束分解符EOF前有制表符或者空格,则EOF不会被当做结束分界符,只会继续被当做stdin来输入#<<-:最后的EOF前面有多个制表符和空格,但仍然会被当做结束分界符,表示stdin的结束## 往文件1.txt写入追加内容 123#cat >> 1.txt <<EOF#123#EOF## 往文件1.txt写入覆盖内容 123#cat >> 1.txt <<EOF#123#EOF#23.less #less 可以随意浏览文件,支持翻页和搜索,支持向上翻页和向下翻页。#-b <缓冲区大小> 设置缓冲区的大小#-e 当文件显示结束后,自动离开#-f 强迫打开特殊文件,例如外围设备代号、目录和二进制文件#-g 只标志最后搜索的关键词#-i 忽略搜索时的大小写#-m 显示类似more命令的百分比#-N 显示每行的行号#-o <文件名> 将less 输出的内容在指定文件中保存起来#-Q 不使用警告音#-s 显示连续空行为一行#-S 行过长时间将超出部分舍弃#-x <数字> 将"tab"键显示为规定的数字空格#/字符串:向下搜索"字符串"的功能#?字符串:向上搜索"字符串"的功能#n:重复前一个搜索(与 / 或 ? 有关)#N:反向重复前一个搜索(与 / 或 ? 有关)#b 向上翻一页#d 向后翻半页#h 显示帮助界面#Q 退出less 命令#u 向前滚动半页#y 向前滚动一行#空格键 滚动一页#回车键 滚动一行#[pagedown]: 向下翻动一页#[pageup]: 向上翻动一页#svn#svn help查看svn帮助#1.svn代码检出#svn co http://路径(目录或文件的全路径)[本地目录全路径] --username 用户名 --password 密码#svn co svn://路径(目录或文件的全路径)[本地目录全路径] --username 用户名 --password 密码#svn checkout http://路径(目录或文件的全路径)[本地目录全路径] --username用户名#svn checkout svn://路径(目录或文件的全路径)[本地目录全路径] --username用户名#常量set -e# 基础# export JAVA_HOME=/work/programs/jdk/jdk1.8.0_181# export PATH=PATH=$PATH:$JAVA_HOME/bin# export CLASSPATH=$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarDATE=$(date +%Y%m%d%H%M)# 当前脚本路径# BASE_PATH=$(pwd)# 项目运行路径BASE_PATH=/work/projects# svn 项目的地址。svn checkout 项目代码到目录下SOURCE_PATH=/svn/projects# 服务名称。同时约定部署服务的 jar 包名字也为它。SERVER_NAME=demo01# 环境PROFILES_ACTIVE=prod# 健康检查 URLHEALTH_CHECK_URL=http://127.0.0.1:8078/actuator/health/# heapError 存放路径HEAP_ERROR_PATH=$BASE_PATH/$SERVER_NAME/heapError# JVM 参数 必须双引号JAVA_OPS="-Xms1024m -Xmx1024m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=$HEAP_ERROR_PATH"# JavaAgent 参数。可用于配置 SkyWalking 等链路追踪JAVA_AGENT=# 拉去代码 使用svn 将最新代码拉取到项目BASE_PATH目录下# 使用 $? 获取函数return返回值function pull() {#判断svn文件存在,拉取svn代码和打包操作if [ -d "$SOURCE_PATH/$SERVER_NAME/.svn" ];thencd $SOURCE_PATH/$SERVER_NAME# 传入svn username and password 的参数if [ -n "$1" -a -n "$2" ];thenecho "[pull] $1 start pull code"svn update --username $1 --password $2if [ $? -eq 0 ];thenecho "[pull] svn拉取代码成功"return 0fiecho "[pull] svn username and password arg not true"elseecho "[pull] svn username or password arg not incoming"fielseecho "[pull] $SOURCE_PATH/$SERVER_NAME/.svn 不存在,跳过拉取代码"fireturn 1}# 打包 使用mvn命令 将项目代码打成jar包,因为没有使用私服,依赖本地仓库,所以打包使用 mvn installfunction package() {#判断svn文件存在,拉取svn代码和打包操作if [ -d "$SOURCE_PATH/$SERVER_NAME" ];thenecho "[package] start mvn package" # 打包操作mvn clean && mvn installif [ $? -eq 0 ];then# 跳转到target目录SOURCE_PATH="$SOURCE_PATH/$SERVER_NAME/target"echo "[package] 打包 $SERVER_NAME.jar 成功"fielseecho "[package] $SOURCE_PATH/$SERVER_NAME not exist" exit fi}# 备份 将原 jar 包备份到 backup 目录下function backup() {# 如果不存在,则无需备份if [ ! -f "$BASE_PATH/$SERVER_NAME.jar" ]; thenecho "[backup] $BASE_PATH/$SERVER_NAME.jar 不存在,跳过备份"# 如果存在,则备份到 backup 目录下,使用时间作为后缀elsecd $BASE_PATHecho "[backup] 开始备份 $SERVER_NAME ..."# 如果backup不存在,创建if [ ! -d $BASE_PATH/backup ];thenmkdir -p $BASE_PATH/backupficp $BASE_PATH/$SERVER_NAME.jar $BASE_PATH/backup/$SERVER_NAME-$DATE.jarecho "[backup] 备份 $SERVER_NAME 完成"fi}# 最新构建代码 移动到项目环境 将 build 目录的新 jar 包,“覆盖”到老的 jar 包上function transfer() {echo "[transfer] 开始转移 $SERVER_NAME.jar"# 删除原 jar 包if [ ! -f "$BASE_PATH/$SERVER_NAME.jar" ]; thenecho "[transfer] $BASE_PATH/$SERVER_NAME.jar 不存在,跳过删除"elseecho "[transfer] 移除 $BASE_PATH/$SERVER_NAME.jar 完成"rm $BASE_PATH/$SERVER_NAME.jarfi# 复制新 jar 包echo "[transfer] 从 $SOURCE_PATH 中获取 $SERVER_NAME.jar 并迁移至 $BASE_PATH ...."cp $SOURCE_PATH/$SERVER_NAME.jar $BASE_PATHecho "[transfer] 转移 $SERVER_NAME.jar 完成"}# 停止 将原 jar 包对应的 Java 进程,进行优雅关闭function stop() {echo "[stop] 开始停止 $BASE_PATH/$SERVER_NAME"PID=$(ps -ef | grep $BASE_PATH/$SERVER_NAME | grep -v "grep" | awk '{print $2}')# 如果 Java 服务启动中,则进行关闭if [ -n "$PID" ]; then# 正常关闭echo "[stop] $BASE_PATH/$SERVER_NAME 运行中,开始 kill [$PID]"kill -15 $PID# 等待最大 60 秒,直到关闭完成。for ((i = 0; i < 60; i++))do sleep 1PID=$(ps -ef | grep $BASE_PATH/$SERVER_NAME | grep -v "grep" | awk '{print $2}')if [ -n "$PID" ]; then# 在echo -e 后,对“\c” 的解释是:produce no further output 不产生进一步的输出 ----》自己理解是在\c 后,这一行后面的内容都不会输出echo -e ".\c"elseecho '[stop] 停止 $BASE_PATH/$SERVER_NAME 成功'breakfidone# 如果正常关闭失败,那么进行强制 kill -9 进行关闭if [ -n "$PID" ]; thenecho "[stop] $BASE_PATH/$SERVER_NAME 失败,强制 kill -9 $PID"kill -9 $PIDfi# 如果 Java 服务未启动,则无需关闭elseecho "[stop] $BASE_PATH/$SERVER_NAME 未启动,无需停止"fi}# 启动 使用新的 jar 包,启动 Java 服务function start() {# 开启启动前,打印启动参数echo "[start] 开始启动 $BASE_PATH/$SERVER_NAME"echo "[start] JAVA_OPS: $JAVA_OPS"echo "[start] JAVA_AGENT: $JAVA_AGENT"echo "[start] PROFILES: $PROFILES_ACTIVE"# 开始启动nohup java -server $JAVA_OPS $JAVA_AGENT -jar $BASE_PATH/$SERVER_NAME.jar --spring.profiles.active=$PROFILES_ACTIVE /dev/null 2>&1 &echo "[start] 启动 $BASE_PATH/$SERVER_NAME 完成"}# 健康检查 通过健康检查 URL ,判断 Java 服务是否启动成功function healthCheck() {# 如果配置健康检查,则进行健康检查if [ -n "$HEALTH_CHECK_URL" ]; then# 健康检查最大 60 秒,直到健康检查通过echo "[healthCheck] 开始通过 $HEALTH_CHECK_URL 地址,进行健康检查";for ((i = 0; i < 60; i++))do# 请求健康检查地址,只获取状态码。result=`curl -I -m 10 -o /dev/null -s -w %{http_code} $HEALTH_CHECK_URL || echo "000"`# 如果状态码为 200,则说明健康检查通过if [ "$result" == "200" ]; thenecho "[healthCheck] 健康检查通过";break# 如果状态码非 200,则说明未通过。sleep 1 秒后,继续重试elseecho -e ".\c"sleep 1fidone# 健康检查未通过,则异常退出 shell 脚本,不继续部署。if [ ! "$result" == "200" ]; thenecho "[healthCheck] 健康检查不通过,可能部署失败。查看日志,自行判断是否启动成功";tail -n 10 nohup.outexit 1;# 健康检查通过,打印最后 10 行日志,可能部署的人想看下日志。elsetail -n 10 nohup.outfi# 如果未配置健康检查,则 slepp 60 秒,人工看日志是否部署成功。elseecho "[healthCheck] HEALTH_CHECK_URL 未配置,开始 sleep 60 秒";sleep 60echo "[healthCheck] sleep 60 秒完成,查看日志,自行判断是否启动成功";tail -n 50 nohup.outfi}# 部署function deploy() {# 拉取代码 $1和$2是参数(svn用户名和密码)pull $1 $2# 打包package# 备份原 jarbackup# 停止 Java 服务stop# 部署新 jartransfer# 启动 Java 服务start# 健康检查healthCheck}deploy

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。