Java后端变成运维的道路

在部署项目在服务器的时候,重新启动一个jar文件总是要三部曲,查询服务进程,停止服务进程,重新启动jar包,刚开始可以记一记,重启的多了,就像流水线般了,所以查看了一些前辈的博客,记录下第一次写脚本的经历。

获取到指定的线程Id

# $1变量是自己shell运行后面跟的第一个参数
# grep -v grep 是在列出的进程中去除含有关键字 grep 的进程
# grep -v /bin/sh 是在列出的进程中去除含有关键字 /bin/sh 的进程 为了排除 shell运行的进程,因为在杀死原来的Java进程后还要执行启动的Java
# awk '{print $2}' 一行一行的读取指定的文件, 以空格作为分隔符,打印第二个字段
ps -ef|grep $1|grep -v grep|grep -v PPID|grep -v /bin/sh|awk '{print $2}'

脚本内容如下

#!/bin/sh
#根据进程名杀死进程
if [ $# -lt 1 ]
then
  echo "缺少重启项目名称"
  exit 1
fi
# 根据输入的应用名,找出指定的应用的进程Id
PROCESS=`ps -ef|grep $1|grep -v grep|grep -v PPID|grep -v /bin/sh|awk '{print $2}'`
# 然后打印杀死进程的Id
echo "Kill the $1 process [ ${PROCESS[0]} ]"
# 杀死指定的进程
kill -9 $PROCESS
echo "执行-----启动"
# 根据指定的应用名称启动指定的应用
if [ $1 = "gateway-1.0.jar" ]
then
  echo "网关重启"
  cd /usr/local/project
  nohup java -jar $1 >nohup.out 2>&1 &
  exit 1
fi
if [ $1 = "enterprise-1.0.jar" ]
then
  echo "企业端重启"
  cd /usr/local/project
  nohup java -jar $1 >nohup.out 2>&1 &
  exit 1
fi
if [ $1 = "management-1.0.jar" ]
then
  echo "管理端重启"
  cd /usr/local/project
  nohup java -jar $1 >nohup.out 2>&1 &
  exit 1
fi
if [ $1 = "user-1.0.jar" ]
then
  echo "用户端重启"
  cd /usr/local/project
  nohup java -jar $1 >nohup.out 2>&1 &
  exit 1
fi

除了一些特定的语法,结构有点相似Java的语法结构,所以看看就知道怎么修改了

将脚本上传服务器,-bash: ./restart.sh: 权限不够,权限不够开启执行的权限,可以指定组开放

如果你是在windows中编译的脚本文件,会报错:-bash: ./restart.sh: /bin/sh^M: 解释器错误: 没有那个文件或目录

windows编译器和linux编译器有所差异,使用命令《sed -i ‘s/\r$//’ 你的脚本文件》,再执行脚本即可

springboot调用linux shell脚本 shell脚本启动springboot项目_jar


编译时报 bad substitution 错误

由于使用的编译器不同导致, 需要使用shell为 #!/bin/bash 即可。

找出指定的应用的进程的命令将 sh 更改为 bash 即可正常使用。