jar自动化启停备份脚本

jar包启停

建议以下脚本和部署的jar(服务)放在同一目录下。

start.sh

jar启动脚本,默认会查找当前目录下jar进行启动,也可传入对应需启动jar路径。

#! /bin/bash

#进入脚本所在目录
cd `dirname $0`

#不传需要启动的jar,默认在当前目录下查找
server_name=$1
if [ -z "$server_name" ];then
  server_name=$(find . -name '*.jar'|head -1)
  if [[ $server_name =~ "/" ]];then
    server_name=${server_name##*/}
  fi
fi

#如果要启动的jar非普通文件,直接返回错误
if [ ! -f "$server_name" ];then
  echo "not find server ->  ${server_name}"
  exit 1
fi
echo "start ${server_name}"

#export JAVA_HOME=jre地址
#export PATH=$PATH:${JAVA_HOME}/bin
#执行
nohup java -XX:+UseG1GC -Xmx512m -XX:MaxGCPauseMillis=200 -XX:GCPauseIntervalMillis=300 -jar $server_name --spring.profiles.active=prod > /dev/null 2>&1 &

exit 0

不能正常启动大部分原因可能是java环境变量问题。

stop.sh

jar停止脚本,默认优雅地停止。可设置默认超时秒数(默认10秒),如果超过超时秒数仍未成功停止,则直接kill进程。

#! /bin/bash

#进入脚本所在目录
cd `dirname $0`

server_name=$1
#默认优雅停止,超过指定秒数直接kill
timeout_seconds=$2

#不传需要停止的服务名,默认在当前目录下查找
if [ -z "$server_name" ];then
  server_name=$(find . -name '*.jar'|head -1)
  if [[ $server_name =~ "/" ]];then
    server_name=${server_name##*/}
  fi
fi

#如果要停止的jar非普通文件,直接返回成功
if [ ! -f "$server_name" ];then
  echo "not find server ->  ${server_name}"
  exit 0
fi

#默认超时时间10秒
default_seconds=10
if [ -z "$timeout_seconds" ];then
  timeout_seconds=$default_seconds
fi

expr $timeout_seconds + 1 > /dev/null 2>&1
timeout_seconds=$([ $? -ne 0 ] && echo $default_seconds || echo ${timeout_seconds})

server_pid=`ps -ef|grep java|grep $server_name|awk '{print $2}'`
echo "kill ${server_pid} -> ${server_name}"

if [ -n "$server_pid" ]; then
  kill ${server_pid}
  tmp_pid=${server_pid}
  while [ -n "$tmp_pid" ]
  do
    sleep 1
    tmp_pid=`ps -ef|grep java|grep $server_name|awk '{print $2}'`
    timeout_seconds=`expr $timeout_seconds - 1`
    if [ $timeout_seconds -lt 0 ] && [ -n "$tmp_pid" ];then
      echo "kill -9 ${server_pid} -> ${server_name}"
      kill -9 ${tmp_pid}
      break;
    fi
  done
fi

exit 0

$1:服务名称,不写会默认查找
$2:停止超时时间,默认10。超过默认时间走kill -9

bak.sh

备份脚本,默认备份当前目录下查找到的一个jar,也可传入jar目录。

#! /bin/bash

#进入脚本所在目录
cd `dirname $0`

day_ymd=$(date +'%Y%m%d')

server_name=$1
if [ -z "$server_name" ];then
  server_name=$(find . -name '*.jar'|head -1)
  if [[ $server_name =~ "/" ]];then
    server_name=${server_name##*/}
  fi
fi

if [ ! -f "$server_name" ];then
  echo "not find server ->  ${server_name}"
  exit 0
fi

suffix_numb=0
for line in $(find ./ -name "${server_name}.${day_ymd}*")
do
  tmp_numb=${line##*-}
  if [ -n "$tmp_numb" ]; then
    expr $tmp_numb + 1 > /dev/null 2>&1
    tmp_numb=$([ $? -ne 0 ] && echo 0 || echo ${tmp_numb})
    if [ $suffix_numb -lt $tmp_numb ]; then
      suffix_numb=$tmp_numb
    fi
  fi
done
suffix_numb=$(expr ${suffix_numb} + 1)

mv ${server_name} ${server_name}.${day_ymd}-${suffix_numb}

exit 0

默认的备份格式是:${server_name}.yyyyMMdd-数字

remote_ci.sh

远程部署脚本,功能:停止远程服务->备份远程服务->传送当前jar到远程服务器->启动远程服务

#! /bin/bash 

#进入脚本所在目录
server_path=$(cd `dirname $0`; pwd)
cd $server_path

remote_address=root@ip
passwd=服务器密码
#远程jar所在目录,这里默认为$server_path
remote_server_path=$server_path

timeout=20
passwderror=0


#需要scp传送的jar名称
server_name=$1
if [ -z "$server_name" ];then
  server_name=$(find . -name '*.jar'|head -1)
  if [[ $server_name =~ "/" ]];then
    server_name=${server_name##*/}
  fi
fi

if [ ! -f "$server_name" ];then
  echo "not find server ->  ${server_name}"
  exit 0
fi

#停止远程服务,并备份
/usr/bin/expect <<EOF

spawn ssh $remote_address "cd ${remote_server_path} ; sh ./stop.sh; sh ./bak.sh"

expect {
  "*assword:*" {
    if { $passwderror == 1 } {
      puts "passwd is error"
      exit 2
    }
    set timeout 1000
    set passwderror 1
    send "$passwd\r"
    exp_continue
  }
  "*es/no)?*" {
    send "yes\r"
    exp_continue
  }
  timeout {
    puts "connect is timeout"
    exit 3
  }
}
EOF

#把新构建的jar传到远程服务器
/usr/bin/expect <<EOF

spawn scp ${server_name} ${remote_address}:${remote_server_path}

expect {
  "*assword:*" {
    if { $passwderror == 1 } {
      puts "passwd is error"
      exit 2
    }
    set timeout 1000
    set passwderror 1
    send "$passwd\r"
    exp_continue
  }
  "*es/no)?*" {
    send "yes\r"
    exp_continue
  }
  timeout {
    puts "connect is timeout"
    exit 3
  }
}
EOF

#启动远程服务器上的jar
/usr/bin/expect <<EOF

spawn ssh $remote_address "cd ${remote_server_path} ; sh ./start.sh"

expect {
  "*assword:*" {
    if { $passwderror == 1 } {
      puts "passwd is error"
      exit 2
    }
    set timeout 1000
    set passwderror 1
    send "$passwd\r"
    exp_continue
  }
  "*es/no)?*" {
    send "yes\r"
    exp_continue
  }
  timeout {
    puts "connect is timeout"
    exit 3
  }
}
EOF

exit 0

expect需要提前安装,yum install expect

remote_ci.sh 优化版

远程部署脚本,功能:传送当前jar到远程服务器->停止远程服务->备份远程服务->启动远程服务

#! /bin/bash 

#进入脚本所在目录
server_path=$(cd `dirname $0`; pwd)
cd $server_path

remote_address=root@ip
passwd=服务器密码
#远程jar所在目录,这里默认为$server_path
remote_server_path=$server_path
#临时目录($server_path下),需要提前创建
remote_server_temp_path=temp

timeout=20
passwderror=0


server_name=$1
if [ -z "$server_name" ];then
  server_name=$(find . -name '*.jar'|head -1)
  if [[ $server_name =~ "/" ]];then
    server_name=${server_name##*/}
  fi
fi

if [ ! -f "$server_name" ];then
  echo "not find server ->  ${server_name}"
  exit 0
fi


/usr/bin/expect <<EOF

spawn scp ${server_name} ${remote_address}:${remote_server_path}/${remote_server_temp_path}

expect {
  "*assword:*" {
    if { $passwderror == 1 } {
      puts "passwd is error"
      exit 2
    }
    set timeout 1000
    set passwderror 1
    send "$passwd\r"
    exp_continue
  }
  "*es/no)?*" {
    send "yes\r"
    exp_continue
  }
  timeout {
    puts "connect is timeout"
    exit 3
  }
}
EOF


/usr/bin/expect <<EOF

spawn ssh $remote_address "cd ${remote_server_path} ; sh ./stop.sh; sh ./bak.sh; mv -f ./${remote_server_temp_path}/${server_name} ./; sh ./start.sh"

expect {
  "*assword:*" {
    if { $passwderror == 1 } {
      puts "passwd is error"
      exit 2
    }
    set timeout 1000
    set passwderror 1
    send "$passwd\r"
    exp_continue
  }
  "*es/no)?*" {
    send "yes\r"
    exp_continue
  }
  timeout {
    puts "connect is timeout"
    exit 3
  }
}
EOF

exit 0
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352