shell编程入门(五)shell脚本部署Java应用

1. 根据PID获取进程信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash
#
# Function: 根据用户输入的PID,过滤出该PID所有的信息
#

read -p "请输入要查询的PID: " P
n=`ps -aux| awk '$2~/^'$P'$/{print $11}'|wc -l`
if [ $n -eq 0 ];then
echo "该PID不存在!"
exit
fi
echo "--------------------------------"
echo "进程PID: $P"
echo "进程命令:`ps -aux| awk '$2~/^'$P'$/{print $11}'`"
echo "进程所属用户: `ps -aux| awk '$2~/^'$P'$/{print $1}'`"
echo "CPU占用率:`ps -aux| awk '$2~/^'$P'$/{print $3}'`%"
echo "内存占用率:`ps -aux| awk '$2~/^'$P'$/{print $4}'`%"
echo "进程开始运行的时刻:`ps -aux| awk '$2~/^'$P'$/{print $9}'`"
echo "进程运行的时间:`ps -aux| awk '$2~/^'$P'$/{print $10}'`"
echo "进程状态:`ps -aux| awk '$2~/^'$P'$/{print $8}'`"
echo "进程虚拟内存:`ps -aux| awk '$2~/^'$P'$/{print $5}'`"
echo "进程共享内存:`ps -aux| awk '$2~/^'$P'$/{print $6}'`"
echo "--------------------------------"

若执行出现权限不够,为shell文件增加执行权限:chmod +x test.sh

2. 使用Shell脚本部署Jar包

将跳板机上(或本地服务器)的jar包文件拷贝到发布服务器,然后通过发布服务器上的脚本实现旧jar包的备份,新jar包的启动。

  • 实现部署的操作:拷贝jar包到服务器 -> 备份旧服务jar包 -> 启动新服务jar包
  • 使用命令:./begin.sh demo-0.0.1-SNAPSHOT.jar
  1. 跳板机(本地服务器)的脚本begin.sh
1
2
3
4
5
6
7
8
9
10
#!/bin/bash
fileName=$1
if [ -z "$fileName" ]; then
echo "文件名不能为空"
exit 0
fi
echo "开始拷贝jar文件【$fileName】到192.168.2.100"
scp $fileName cmuser@192.168.2.100:/usr/local/test/$fileName.prev
echo "文件传输结束,准备启动192.168.2.100的部署脚本"
ssh cmuser@192.168.2.100 /usr/local/test/demo-deploy.sh $fileName

通过上面的跳板机上的代码,我们知道跳板机最终会调用发布服务器上/usr/local/test/demo-deploy.sh这个shell脚本命令。

  1. 发布服务器脚本demo-deploy.sh
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#!/usr/bin/env bash
echo "服务器开始部署服务"
projectname="demo"

# 打开文件所属的目录,不然远程执行会找不到当前目录
cd /usr/local/test

# 新的jar包会当成参数传过来
newJar=$1
echo "新的jar为:$newJar"
# 如果新的jar包为空则退出
if [ -z "$newJar" ]; then
echo "新的jar不能为空"
exit 0
fi

# 获取旧的jar包名称,当然可能是空的,也可能跟当前名称一致
oldJar=$(ps -ef | grep ${projectname}|grep -v 'demo-deploy.sh'|grep -v grep|awk '{print $10}'|cut -d '/' -f 2)
echo "当前运行的旧的jar包为:$oldJar"
#如果新的jar包为空则退出
if [ -z "$oldJar" ]; then
echo "没有启动的demo服务"
else
# 如果旧的进程还在就将旧的进程杀掉
oldId=`ps -ef|grep ${projectname}|grep -v "$0"|grep -v "grep"|awk '{print $2}'`
echo "$oldId"
echo "kill old process start ..."
for id in $oldId
do
kill -9 $id
echo "killed $id"
done
echo "kill old process end"
# 获取当前时间戳
suffix=".bak-"`date '+%s%3N'`;
echo $suffix;
# 将旧的jar包进行备份
mv $oldJar ${oldJar}${suffix}
fi

# 开始启动新的进程
mv ${1}.prev ${1}
nohup java -jar ${1} > run.txt 2>&1 &
echo "服务启动查看进程:"
echo `ps -ef | grep ${projectname}|grep -v 'demo-deploy.sh'|grep -v grep`
  1. 演示
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    # 跳板机
    [cmuser@localhost test]$ ./begin.sh demo-0.0.1-SNAPSHOT.jar
    开始拷贝jar文件【demo-0.0.1-SNAPSHOT.jar】到192.168.2.100
    cmuser@192.168.2.100's password:
    demo-0.0.1-SNAPSHOT.jar 100% 20MB 11.2MB/s 00:01
    文件传输结束,准备启动192.168.2.100的部署脚本
    cmuser@192.168.2.100's password:
    服务器开始部署服务
    新的jar为:demo-0.0.1-SNAPSHOT.jar
    当前运行的旧的jar包为:demo-0.0.1-SNAPSHOT.jar
    2581
    kill old process start ...
    killed 2581
    kill old process end
    .bak-20201117
    服务启动查看进程:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # 发布服务器(部署前pid:2581)
    [cmuser@192.168.2.100 test]$ ps -ef | grep demo
    cmuser 2581 1 16 17:03 ? 00:00:06 java -jar demo-0.0.1-SNAPSHOT.jar

    [cmuser@192.168.2.100 test]$ ll
    total 40260
    -rw-rw-r--. 1 cmuser cmuser 20606107 Nov 18 15:45 demo-0.0.1-SNAPSHOT.jar
    -rw-rw-r--. 1 cmuser cmuser 20606111 Nov 18 15:06 demo-0.0.1-SNAPSHOT.jar.bak-1605685530423
    -rwxrwxr-x. 1 jenkins jenkins 1356 Nov 17 17:56 demo-deploy.sh
    -rwxrwxrwx. 1 jenkins jenkins 1207 Nov 18 15:45 run.txt

    # 发布服务器(部署后:2653)
    [cmuser@192.168.2.100 test]$ ps -ef | grep demo
    cmuser 2653 1 59 17:04 ? 00:00:07 java -jar demo-0.0.1-SNAPSHOT.jar