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

#!/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

#!/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脚本

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

#!/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,命令格式为:

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上生成公钥/私钥对

ssh-keygen -t rsa

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

ssh-copy-id root@43.143.195.160

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

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

脚本:

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

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

#!/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年开始编写。

如何安装

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

如何使用

vim copyFile.sh

#!/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管理脚本工具

#!/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 

#!/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启动脚本,自动打包部署

#!/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 @ 2022-06-07 16:20  Java小白的搬砖路  阅读(502)  评论(0编辑  收藏  举报