Shell脚本简单示例

 


Shell编程100例:https://zhuanlan.zhihu.com/p/509956726?utm_source=wechat_session&utm_medium=social&utm_oi=988048367724900352

一、Shell概述

shell 是一种脚本语言

脚本:本质是一个文件,文件里面存放的是 特定格式的指令,系统可以使用脚本解析器 翻译或解析 指令 并执行(它不需要编译)

shell 既是应用程序 又是一种脚本语言(应用程序 解析 脚本语言)

shell命令解析器:

系统提供 shell命令解析器: sh ash bash

查看自己linux系统的默认解析:echo $SHELL

写这篇文章的目的是,基于Shell,批量启动/停止Tomcat的教程。

二、使用Shell脚本自动安装JDK8

使用此脚本,你只需要将jdk-8u144-linux-x64.tar.gz这个压缩包放在/root目录下,并新建一个脚本文件,即可实现安装JDK,并自动配置环境变量。

脚本文件:install_jdk.sh

1、  在用户家目录(/root)下新建install_jdk.sh文件 

2、  将JDK安装包放在/root目录下,这里注意一下要注意脚本中的jdk路径,要与存放的jdk目录一直,否则会找不到

3、  执行脚本:bash install_jdk.sh

复制代码
#!/bin/bash

# jdk存放目录(指定jdk放在/root目录下)
jdkTarget="/root/jdk-8u144-linux-x64.tar.gz"
jdkInstallCatalogue="/usr/local/java"

# 检查原先是否已配置java环境变量
checkExist(){
 jdk1=$(grep -n "export JAVA_HOME=.*" /etc/profile | cut -f1 -d':')
    if [ -n "$jdk1" ];then
        echo "JAVA_HOME已配置,删除内容"
        sed -i "${jdk1}d" /etc/profile
    fi

 jdk2=$(grep -n "export CLASSPATH=.*\$JAVA_HOME.*" /etc/profile | cut -f1 -d':')
    if [ -n "$jdk2" ];then
        echo "CLASSPATH路径已配置,删除内容"
        sed -i "${jdk2}d" /etc/profile
    fi

 jdk3=$(grep -n "export PATH=.*\$JAVA_HOME.*" /etc/profile | cut -f1 -d':')
    if [ -n "$jdk3" ];then
        echo "PATH-JAVA路径已配置,删除内容"
        sed -i "${jdk3}d" /etc/profile
    fi
}

# 查询是否有jdk.tar.gz
if [ -e $jdkTarget ];then

  #查询jdk安装目录是否存在
    if [ -d $jdkInstallCatalogue ]; then
        echo "— — 删除原jdk安装目录内的所有内容 — —"
        rm -rf /usr/local/java/*
    else
        echo "— — 创建JDK安装目录 — —"
        mkdir -p /usr/local/java &> /dev/null
    fi

  echo "— — 存在jdk压缩包 — —"
  echo "正在解压jdk压缩包..."
  tar -zxvf /root/jdk-8u144-linux-x64.tar.gz -C /usr/local/java/ &> /dev/null

# 检查配置信息
 checkExist

  echo "---------------------------------"
  echo "正在配置jdk环境..."
  sed -i '$a export JAVA_HOME=/usr/local/java/jdk1.8.0_144' /etc/profile
  sed -i '$a export PATH=.:$JAVA_HOME/bin:$PATH' /etc/profile
  sed -i '$a export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar' /etc/profile
  echo "---------------------------------"
  echo "JAVA环境配置已完成..."
  echo "---------------------------------"
  echo "正在重新加载配置文件..."
  echo "---------------------------------"
  source /etc/profile
  echo "配置版本信息如下:"
  java -version
else
  echo "未检测到安装包,请将安装包放到/root目录下"
fi
复制代码

三、使用Shell脚本自动安装Tomcat

使用此脚本,你无需再额外的下载Tomcat的压缩包,该脚本会自动从Apache官网上面下载指定的Tomcat版本。

当然你如果已经有了安装包放在了/root下,脚本也会自动检测到压缩包,并自动安装并启动Tomcat。

脚本文件:install_tomcat.sh

复制代码
#!/bin/bash
#定义函数check
function check(){
  if [ $? == 0 ]; then
          echo -e "\033[32m success \033[0m"
  else
          echo -e "\033[31m fail \033[0m"
          exit 0
  fi
}

#创建tomcat目录
if [ -d /usr/local/tomcat ];then
        echo "— — 删除原tomcat安装目录内的所有内容 — —"
        rm -rf /usr/local/tomcat/* &> /dev/null
        cd /usr/local/tomcat &> /dev/null
else
        echo "正在创建tomcat目录"
        mkdir -p /usr/local/tomcat &> /dev/null
        cd /usr/local/tomcat &> /dev/null
fi
check
#下载tomcat8
if [ -e apache-tomcat-8.0.23.tar.gz ];then
        tar -zxvf apache-tomcat-8.0.23.tar.gz &> /dev/null
        echo "正在安装tomcat8"
else
        echo "正在下载tomcat8"
        wget https://archive.apache.org/dist/tomcat/tomcat-8/v8.0.23/bin/apache-tomcat-8.0.23.tar.gz && tar -zxvf apache-tomcat-8.0.23.tar.gz &> /dev/null
        echo "正在解压tomcat8"
fi
check
#启动tomcat服务
echo "正在启动tomcat服务"
cd apache-tomcat-8.0.23/bin && ./startup.sh &> /dev/null
check
echo -e "\033[32m 安装成功并启动tomcat服务 \033[0m"
 
复制代码

四、使用Shell脚本批量关闭Tomcat,并清理Tomcat日志

在日常的工作中,难免有需要关闭tomcat的功能,如果一个服务器上面有好几个tomcat,一个个手动关闭进程实在是太繁琐,所以本案例演示一下如何使用shell批量关闭tomcat进程,并清理log文件释放磁盘空间。

脚本文件:shutdown_all_tomcat.sh

复制代码
#!/bin/bash
echo -e "\e[34m ==================start【`date +"%Y-%m-%d %H:%M:%S"`】================== \e[0m"
echo -e "\e[33m ==================【批量关闭tomcat,并清理log文件夹】site:================== \e[0m"

# 定义全局变量(有几个tomcat,写几个tomcat的路径)
tomcat_dir=(
  /usr/local/tomcat/apache-tomcat-8.0.23
  /usr/local/tomcat/apache-tomcat-8.0.23-01
)

echo "开始清理日志,释放磁盘空间"
for(( i=0;i<${#tomcat_dir[@]};i++))
do
    if [ -d  ${tomcat_dir[i]} ]; then
        rm -f ${tomcat_dir[i]}/logs/*;
        echo "${tomcat_dir[i]}日志文件清理完成"
      else
        echo -e "\033[31m目录:${tomcat_dir[i]}不存在,无法指定清理日志工作! \033[0m"
      fi
done;
echo "日志文件清理结束"

echo "停止tomcat服务"
echo -e "\e[34m ==================end【`date +"%Y-%m-%d %H:%M:%S"`】================== \e[0m"
ps -ef | grep tomcat | grep -v grep | cut -c 9-15 | xargs kill -9 &> /dev/null
复制代码

关闭指定Tomcat进程

chmod +x kill_tomcat.sh
./kill_tomcat.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash
 
# Get the PID of the tomcat-rfwm process
pid=$(ps -ef | grep tomcat-rfwm | awk '{print $2}')
 
# Kill the process
kill -9 $pid
 
# Check if the process was successfully killed
if [ $? -eq 0 ]
then
  echo "tomcat-rfwm process was successfully killed with PID: $pid"
else
  echo "Failed to kill tomcat-rfwm process with PID: $pid"
fi

无、使用Shell脚本批量启动tomcat

脚本文件:start_all_tomcat.sh

复制代码
#!/bin/bash
echo -e "\e[34m ==================start【`date +"%Y-%m-%d %H:%M:%S"`】================== \e[0m"
echo -e "\e[33m ==================【批量启动Tomcat服务器】site:================== \e[0m"

# 定义全局变量(有几个tomcat,写几个tomcat的路径)
tomcat_dir=(
  /usr/local/tomcat/tomcat-web1
  /usr/local/tomcat/tomcat-web2
)

for(( i=0;i<${#tomcat_dir[@]};i++))
do
  if [ -d  ${tomcat_dir[i]} ]; then
    echo "正在启动:${tomcat_dir[i]}服务"
    cd ${tomcat_dir[i]}/bin && ./startup.sh tail -f ../logs/catalina.out &> /dev/null
  else
    echo -e "\033[31m目录:${tomcat_dir[i]}不存在,无法启动服务! \033[0m"
  fi
done;
echo -e "\e[34m ==================end【`date +"%Y-%m-%d %H:%M:%S"`】================== \e[0m"
复制代码

1、  在用户家目录(/root)下新建start_all_tomcat.sh文件

2、  在脚本文件中修改自己的tomcat路径

3、  启动脚本

模拟两个Tomcat:

 执行脚本:

 两台Tomcat已成功启动:

六、Tomcat重启脚本,可添加多个Tomcat

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash
export JAVA_HOME=/usr/local/java/jdk1.8.0_144
# tomcat的位置
tomcat_home=/usr/local/tomcat8/apache-tomcat-8.5.51
#【1】 停止tomcat变量
SHUTDOWN=$tomcat_home/bin/shutdown.sh
#【2】 启动tomcat变量
STARTTOMCAT=$tomcat_home/bin/startup.sh
 
#【3】 获取进程ID
PID=`ps -ef |grep $tomcat_home/conf |grep -v grep | awk '{print $2}'`
if [ ! "$PID" ];then # 这里判断TOMCAT进程是否存在
    echo "进程不存在"
else
    echo "进程存在,关闭Tomcat"
    kill -9 $PID
fi
 
#【4】启动项目
$STARTTOMCAT  
echo "启动项目"

七、使用Shell脚本实现自动拉取、编译、打包、发布项目

1、环境

1.1:需要准备的环境是,Java、Maven、Git:

  均可以参考我的这篇文章进行安装:https://www.cnblogs.com/zhangzhixi/p/14399602.html

1.2:进行测试的项目(代码已经写好了,不用配置其他东西):

  git地址:https://gitee.com/zhang-zhixi/ruiji-takeout.git

2、编写shell脚本

什么也不用配置,你只管执行,剩下的交给我~

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
46
47
48
49
50
51
52
53
#!/bin/sh
echo =================================
echo  自动化部署脚本启动
echo =================================
 
echo 停止原来运行中的工程
APP_NAME=ruiji-takeout
 
tpid=`ps -ef|grep $APP_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
    echo 'Stop Process...'
    kill -15 $tpid
fi
sleep 2
tpid=`ps -ef|grep $APP_NAME|grep -v grep|grep -v kill|awk '{print $2}'`
if [ ${tpid} ]; then
    echo 'Kill Process!'
    kill -9 $tpid
else
    echo 'Stop Success!'
fi
 
#创建项目目录
if [ -d /usr/local/project/ ];then
        cd /usr/local/project/
else
        echo "项目目录不存在,正在努力创建中……"
        mkdir -p /usr/local/project
        cd /usr/local/project/
fi
 
 
echo 准备从Git仓库拉取/下载最新代码
if [ -d /usr/local/project/ruiji-takeout ];then
        echo 开始从Git仓库拉取最新代码
        cd ruiji-takeout
        git pull https://gitee.com/zhang-zhixi/ruiji-takeout.git
else
        echo "正在创建文件夹,并克隆项目"
        git clone https://gitee.com/zhang-zhixi/ruiji-takeout.git
        cd ruiji-takeout/
fi
 
echo 代码拉取完成
 
echo 开始打包
output=`mvn clean package -Dmaven.test.skip=true`
 
cd target
 
echo 启动项目
nohup java -jar reggie-takeout-0.0.1-SNAPSHOT.jar &> helloworld.log &
echo 项目启动完成

成功访问:

八、服务器之间传输文件:scp

  通常我们在服务器之间传输文件,使用的命令是scp,命令格式为:

1
2
3
scp 文件/目录 用户@主机名:远端目录
 
scp -r test.txt root@Ip:/root

  如果我们使用Shell脚本传输文件应该如何操作呢?

直接使用scp命令是不可以的,因为在通过SCP命令进行文件传输时,如果目标服务器上的帐户没有免密码登录的公钥,则必须在脚本中输入密码。

  假设我们有个需求,A服务器向B服务器发送文件(首先A能ping通B)

  A服务器:182.92.209.212

  B服务器:43.143.195.160

1、在服务器A上生成公钥/私钥对

1
ssh-keygen -t rsa

2、将公钥复制到服务器B

1
ssh-copy-id root@43.143.195.160

3、编写shell脚本,执行测试

1
2
3
4
5
6
# 创建脚本
touch scp.sh
# 添加权限
chmod 777 scp.sh
# 执行脚本
nohup bash scp.sh >> scp.log 2>&1 &

脚本:

  选项-r用于递归传输,意味着整个目录都会被复制到目标主机上。

  选项-q用于安静模式,意味着不显示任何状态或进度信息

1
2
3
4
5
6
7
#!/bin/bash
# 定义源文件路径和目标文件路径
source_file='/111.txt'
destination_file='/root'
         
# 使用 scp 命令将文件从服务器 A 传输到服务器 B
nohup scp -rq $source_file root@43.143.195.160:$destination_file >> scp.log 2>&1 &

八-一、服务器之间传输文件(自动输入密码):expect

什么是expect

  Expect是一个用来实现自动和交互式任务进行通信的免费编程工具语言。由Don Libes在1990年开始编写。

如何安装

1
2
3
4
5
#在CentOS或RHEL系统上,可以使用以下命令安装expect工具:
sudo yum -y install expect
#在Ubuntu或Debian系统上,可以使用以下命令安装expect工具:
sudo apt-get update
sudo apt-get install expect

如何使用

vim copyFile.sh

1
2
3
4
5
#!/usr/bin/expect -f
spawn scp -r 要传输文件或者目录 root@目的主机ip:/目的主机目录
expect "*password:"
send "密码\r"
expect eof

expect copyFile.sh

 九、凌晨跑定时任务:关闭进程、创建文件夹、访问任务链接等

博客地址:https://www.cnblogs.com/zhangzhixi/p/15784721.html#_label1_3

 十、一个方便功能完善的Linux管理脚本工具

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
#!/bin/bash
 
# 判断系统类型,选择合适的包管理器
if [ -n "$(command -v yum)" ]; then
  PKGMGR="yum"
elif [ -n "$(command -v apt-get)" ]; then
  PKGMGR="apt-get"
else
  echo "无法确认系统类型,请手动安装软件包。"
  exit 1
fi
 
# 安装必需的工具和软件包
for TOOL in curl tar zstd unzip; do
  if ! command -v $TOOL > /dev/null; then
    sudo $PKGMGR install -y $TOOL
  fi
done
 
# 菜单文字提示
function menu() {
  cat << EOF
=========================================
           Linux 系统管理工具           
=========================================
1. 进程管理
2. 磁盘管理
3. 网络管理
4. 日志分析
5. 用户管理
6. 安全管理
7. 系统信息
8. 定时任务
0. 退出
=========================================
EOF
  read -p "请输入数字选择相应的菜单:" CHOICE
}
 
# 进程管理
function process_mgmt() {
  while true
  do
    cat << EOF
-----------------------------------------
               进程管理                 
-----------------------------------------
1. 列出所有进程
2. 杀死指定进程
3. 按照端口杀死进程
0. 返回上一级菜单
-----------------------------------------
EOF
    read -p "请输入数字选择相应的菜单:" CHOICE
    case $CHOICE in
      1)
        ps aux
        ;;
      2)
        read -p "请输入要杀死的进程 ID:" PID
        kill $PID
        ;;
      3)
        read -p "请输入要杀死的端口号:" PORT
        sudo fuser -k $PORT/tcp
        ;;
      0)
        break
        ;;
      *)
        echo "错误的选择。"
        ;;
    esac
  done
}
 
# 磁盘管理
function disk_mgmt() {
  while true
  do
    cat << EOF
-----------------------------------------
               磁盘管理                 
-----------------------------------------
1. 查看磁盘使用情况
2. 清理磁盘空间
0. 返回上一级菜单
-----------------------------------------
EOF
    read -p "请输入数字选择相应的菜单:" CHOICE
    case $CHOICE in
      1)
        df -h
        ;;
      2)
        read -p "请输入要清理的文件路径:" PATH
        sudo find $PATH -type f -mtime +30 -delete
        ;;
      0)
        break
        ;;
      *)
        echo "错误的选择。"
        ;;
    esac
  done
}
 
# 网络管理
function network_mgmt() {
  while true
  do
    cat << EOF
-----------------------------------------
               网络管理                 
-----------------------------------------
1. 查看网络连接
2. 配置网络接口
3. 查询端口信息
4. 扫描局域网设备
0. 返回上一级菜单
-----------------------------------------
EOF
    read -p "请输入数字选择相应的菜单:" CHOICE
    case $CHOICE in
      1)
        netstat -anp
        ;;
      2)
        sudo nano /etc/network/interfaces
        ;;
      3)
        read -p "请输入要查询的端口号:" PORT
        sudo lsof -i:$PORT
        ;;
      4)
        read -p "请输入 IP 地址范围(例如:192.168.1.1/24):" IP_RANGE
        sudo nmap -sP $IP_RANGE
        ;;
      0)
        break
        ;;
      *)
        echo "错误的选择。"
        ;;
    esac
  done
}
 
# 日志分析
function log_analysis() {
  while true
  do
    cat << EOF
-----------------------------------------
               日志分析                 
-----------------------------------------
1. 查看系统日志
2. 筛选关键字
3. 保存日志
0. 返回上一级菜单
-----------------------------------------
EOF
    read -p "请输入数字选择相应的菜单:" CHOICE
    case $CHOICE in
      1)
        cat /var/log/syslog
        ;;
      2)
        read -p "请输入要筛选的关键字:" KEYWORD
        cat /var/log/syslog | grep $KEYWORD
        ;;
      3)
        read -p "请输入要保存的文件路径:" FILEPATH
        cat /var/log/syslog > $FILEPATH
        ;;
      0)
        break
        ;;
      *)
        echo "错误的选择。"
        ;;
    esac
  done
}
 
# 用户管理
function user_mgmt() {
  while true
  do
    cat << EOF
-----------------------------------------
               用户管理                 
-----------------------------------------
1. 查看用户列表
2. 添加用户
3. 删除用户
4. 修改用户密码
0. 返回上一级菜单
-----------------------------------------
EOF
    read -p "请输入数字选择相应的菜单:" CHOICE
    case $CHOICE in
      1)
        cat /etc/passwd
        ;;
      2)
        read -p "请输入新用户的用户名:" USERNAME
        sudo adduser $USERNAME
        ;;
      3)
        read -p "请输入要删除的用户的用户名:" USERNAME
        sudo userdel -r $USERNAME
        ;;
      4)
        read -p "请输入要修改密码的用户名:" USERNAME
        sudo passwd $USERNAME
        ;;
      0)
        break
        ;;
      *)
        echo "错误的选择。"
        ;;
    esac
  done
}
 
# 安全管理
function security_mgmt() {
  while true
  do
    cat << EOF
-----------------------------------------
               安全管理                 
-----------------------------------------
1. 修改 SSH 端口
2. 禁止 ROOT 登录
0. 返回上一级菜单
-----------------------------------------
EOF
    read -p "请输入数字选择相应的菜单:" CHOICE
    case $CHOICE in
      1)
        read -p "请输入新的 SSH 端口号:" PORT
        sudo sed -i "s/Port .*/Port $PORT/g" /etc/ssh/sshd_config
        sudo service sshd restart
        ;;
      2)
        sudo sed -i "s/PermitRootLogin yes/PermitRootLogin no/g" /etc/ssh/sshd_config
        sudo service sshd restart
        ;;
      0)
        break
        ;;
      *)
        echo "错误的选择。"
        ;;
    esac
  done
}
 
# 系统信息
function system_info() {
  cat << EOF
=========================================
               系统信息                 
=========================================
操作系统:$(lsb_release -d | cut -f2-)
内核版本:$(uname -r)
CPU 信息:$(grep "model name" /proc/cpuinfo | head -n1 | cut -d: -f2-)
内存信息:$(free -h | awk 'NR==2 {print $2}')
磁盘信息:$(df -h | awk '$NF=="/" {print "总容量:" $2 ", 剩余容量:" $4}')
=========================================
EOF
}
 
# 定时任务
function cron_job() {
  crontab -l
}
 
# 主循环
while true
do
  menu
  case $CHOICE in
    1)
      process_mgmt
      ;;
    2)
      disk_mgmt
      ;;
    3)
      network_mgmt
      ;;
    4)
      log_analysis
      ;;
    5)
      user_mgmt
      ;;
    6)
      security_mgmt
      ;;
    7)
      system_info
      ;;
    8)
      cron_job
      ;;
    0)
      echo "谢谢使用,再见!"
      exit 0
      ;;
    *)
      echo "错误的选择。"
      ;;
  esac
done

 十一:备份json文件夹,每小时执行一次,保留7天的备份

cron定时: 0 * * * * /usr/local/project/material-project/cj_json_folder_bak.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
#!/bin/bash
#README:备份json文件夹,每小时执行一次,保留7天的备份
# 源json文件夹
project_json_path="/usr/local/project/material-project/json"
# 项目json文件夹(要进行备份的地址)
linux_json_path="/usr/local/project/material-project/json_bak"
 
if [ ! -d $linux_json_path ]; then
  echo "项目文件夹不存在"
  mkdir -p $linux_json_path
fi
 
cd $linux_json_path || exit
 
# 获取当前日期,并计算出7天前的日期
current_day=$(date +%Y-%m-%d)
seven_days_ago=$(date -d "7 days ago" +%Y-%m-%d)
 
# 删除7天前的文件夹及其内容
find . -type d -name "$seven_days_ago*" -exec rm -rf {} +
 
# 获取当前小时,并创建对应的文件夹
current_hour=$(date +%H)
backup_folder="${linux_json_path}/${current_day}/${current_hour}"
mkdir -p "${backup_folder}"
 
# 备份操作,如果project_json_path不存在,则不执行
if [ ! -d $project_json_path ]; then
  echo "项目文件夹不存在"
  exit
fi
 
# 备份
cp -r $project_json_path "${backup_folder}"

十二、线上Jenkins启动脚本,自动打包部署

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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#!/bin/bash
 
# 常量
JAVA_PATH=/usr/local/java/jdk1.8.0_144                                                                           # JDK位置
project_jar_path=/usr/local/project/material-project/material/material_parent/material_cj/target/material_cj.jar # 最后运行的jar包位置
log_path="/usr/local/project/material-project/material/material.out"                                             # 日志输出位置
 
# 项目文件地址和svn地址
dhc_projectDir="/usr/local/project/material-project/asp5.0"        # 项目文件夹位置
dhc_svnPath="svn://www.mixky.cn/东华监督检查项目/代码管理/trunk/dhc"           #项目svn地址
material_projectDir="/usr/local/project/material-project/material" # 项目文件夹位置
material_svnPath="svn://www.mixky.cn/中铁物资全流程信息管理系统/代码管理/trunk"     #项目svn地址
 
JVM_PARAMS="-Xms512m -Xmx512m" #jvm参数
# REMOTE_DEBUG="-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005" # 线上debug
SERVER_PORT=8068 # 服务端口
 
# 记录开始时间
begin_time=$(date +"%Y-%m-%d %H:%M:%S")
echo -e "\e[34m ==================start【$(date +"%Y-%m-%d %H:%M:%S")】================== \e[0m" >>$log_path
# 一、编译项目
# 1.1、检查项目文件夹是否存在
if [ ! -d $dhc_projectDir ]; then
  echo "创建asp5.0文件夹"
  mkdir -p $dhc_projectDir
fi
 
cd "$dhc_projectDir" || exit
 
# 1.2、检出/更新项目
# shellcheck disable=SC2046
if [[ "$(ls -A .)" ]]; then
  echo "检出asp5.0项目" >>$log_path
  svn co "$dhc_svnPath" .
  # 编译项目
#  echo "编译asp5.0项目" >>$log_path
#  /mixky/software/apache-maven-3.6.3/bin/mvn8 clean install -Dmaven.test.skip=true >>$log_path
else
  echo "更新asp5.0项目" >>$log_path
  svn up
  # 编译项目
#  echo "编译asp5.0项目" >>$log_path
#  /mixky/software/apache-maven-3.6.3/bin/mvn8 clean install -Dmaven.test.skip=true >>$log_path
fi
 
echo "##########################dhc项目编译完成##########################" >>$log_path
# 1.3、检查项目文件夹是否存在
if [[ ! -d "$material_projectDir" ]]; then
  echo "创建material文件夹"
  mkdir -p $material_projectDir
fi
 
cd $material_projectDir || exit
 
# 1.4、检出/更新项目
# shellcheck disable=SC2046
if [[ "$(ls -A .)" ]]; then
  echo "检出material项目" >>$log_path
  svn co "$material_svnPath" .
  # 编译项目
  echo "编译material项目" >>$log_path
  cd material_parent || exit
  /mixky/software/apache-maven-3.6.3/bin/mvn8 clean install -Dmaven.test.skip=true >>$log_path
else
  # shellcheck disable=SC2129
  echo "更新material项目" >>$log_path
  svn up >>$log_path
  # 编译项目
  echo "编译material项目" >>$log_path
  cd material_parent || exit
  /mixky/software/apache-maven-3.6.3/bin/mvn8 clean install -Dmaven.test.skip=true >>$log_path
fi
echo "##########################material项目编译完成##########################" >>$log_path
 
## 二、启动项目
function start_project {
  nohup $JAVA_PATH/bin/java $JVM_PARAMS -jar $REMOTE_DEBUG -Dserver.port=$SERVER_PORT $project_jar_path --spring.profiles.active=test >>$log_path 2>&1 &
}
 
# 2.1、获取进程ID
PID=$(pgrep -f $project_jar_path | grep -v grep)
 
# 2.2、判断进程是否存在
if pgrep -f $project_jar_path >/dev/null; then
  echo "进程存在,关闭项目,然后重启~" >>$log_path
  kill "$PID"
  sleep 5
  kill -9 "$PID" >/dev/null 2>&1
  start_project
else
  echo "进程不存在,启动项目" >>$log_path
  start_project
fi
 
# 记录结束时间
end_time=$(date +"%Y-%m-%d %H:%M:%S")
#记录开始时间和结束时间,计算耗时
echo -e "\e[34m ==================开始时间:$begin_time================== \e[0m" >>$log_path
echo -e "\e[34m ==================结束时间:$end_time================== \e[0m" >>$log_path
echo -e "\e[34m ==================耗时:$(($(date +%s -d "$end_time") - $(date +%s -d "$begin_time")))s================== \e[0m" >>$log_path

  

 

posted @   Java小白的搬砖路  阅读(538)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通

喜欢请打赏

扫描二维码打赏

支付宝打赏

点击右上角即可分享
微信分享提示