在日常开发中,我们经常会将项目打成 jar 包,部署到服务器上运行,但每次启动项目都要使用 jar -jar 命令,停止项目还需要先查找程序进程 pid,然后再进行 kill。如果只是部署一两次,手动操作没有什么多大问题,要是需要经常重新部署,每次输入命令也是挺麻烦的,因此我们可以通过编写 shell 脚本来解决这个问题


一、编写 shell 脚本

  • 首先我们需要一个可运行的项目 jar 包,将其部署到服务器上 (springboot-0.0.1-SNAPSHOT.jar)
  • 然后我们再来编写 shell 脚本 (sh 名称为 run.sh),如下所示
#!/bin/bash

#项目路径
APP_NAME=springboot-0.0.1-SNAPSHOT.jar
#配置文件路径
APP_CONF=application.yml

#使用说明,用来提示输入参数
usage() {
	echo "Usage: run.sh {start|stop|restart|status}"
	exit 1
}

#检查程序是否正在运行
is_running() {
	pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}'`
	#如果不存在则返回1,存在则返回0
	if [ -z "${pid}" ];
	then
		return 1
	else
		return 0
	fi
}

#启动
start() {
	is_running
	if [ $? -eq 0 ];
	then
		echo "${APP_NAME} is already running, pid=${pid}"
	else
		nohup java -jar ${APP_NAME} --spring.config.location=${APP_CONF} > nohup.out 2>&1 &
	fi
}

#停止
stop() {
	is_running
	if [ $? -eq 0 ];
	then
		kill -9 $pid
	else
		echo "${APP_NAME} is not running"
	fi
}

#查看运行状态
status() {
	is_running
	if [ $? -eq 0 ];
	then
		echo "${APP_NAME} is running, pid is ${pid}"
	else
		echo "${APP_NAME} is not running"
	fi
}

#重启
restart() {
	stop
	sleep 5
	start
}

#根据输入的参数,选择对应的执行方法,不输入则执行使用说明
case "$1" in
	start)
		start
		;;
	stop)
		stop
		;;
	status)
		status
		;;
	restart)
		restart
		;;
	*)
		usage
		;;
esac
  • 编写好之后,我们赋予其可执行权限 chmod +x run.sh,就可以使用了

命令

作用

./run.sh start

启动程序

./run.sh stop

关闭程序

./run.sh status

查看程序运行状态

./run.sh restart

重启程序


二、语法解析

  • Linux 退出状态码

状态码

描述

0

命令成功结束

1

通用未知错误

2

误用 shell 命令

126

命令不可执行

127

没找到命令

128

无效退出参数

128+x

Linux 信号 x 的严重错误

130

命令通过 Ctrl+C 终止

255

退出状态码越界

  • 标准输入输出

状态码

描述

0

标准输入 (stdin)

1

标准输出 (stdout)

2

标准错误 (stderr)

  • shell 语句解析
  • ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}'
  • ps -ef|grep $APP_NAME
  • 用于查看当前程序的进程信息
  • grep -v grep
  • 用于显示不包含 grep 的所有行
  • awk '{print $2}'
  • 对文本数据进行处理,打印第二列数据 (第二列数据为进程 pid)
  • if [ -z "${pid}" ]
  • -z
  • 判断字符串是否为空,如果为空,则为 true;如果不为空,则为 false
  • -n
  • 判断字符串是否不为空,如果为空,则为 false;如果不为空,则为 true
  • nohup java -jar ${APP_NAME} > nohup.out 2>&1 &
  • nohup java -jar ${APP_NAME}
  • 启动程序
  • nohup.out 2>&1 &
  • 将正常输出和错误输出都输出到 nohup.out 文件中
  • 在 > 左边的 2,表示标准错误 (stderr),不需要加 &
  • 在 > 右边的 1 必须加 &,才能表示标准输出 (stdout);如果不加,则表示的是文件名

三、异常解析

  • 如果是在 Windows 下编辑好脚本,再上传到 linux 上运行的话,会报以下异常
  • 启动yarn的shell脚本为 linux shell脚本启动程序_Shell

  • 这是因为 Windows 和 Linux 下的换行回车格式不同,Windows 下的格式为 dos,Linux 下的格式为 unix,因此我们需要进行格式转换
  • 在 vim 命令模式中,我们可以使用 :set ff 命令来查看当前文件的 format 格式 (此时为 dos)
  • 然后通过 :set ff=unix 命令将 dos 修改为 unix,保存并退出 (此时为 unix)
  • 此时我们再启动脚本,就不会有问题了

四、参考资料

  • [shell]shell中if语句的使用
  • shell退出,返回小结exit、break、echo
  • Linux学习总结(53)——后台启动nohup >/dev/null 2>&1 使用总结
  • shell脚本报错:-bash: xxx: /bin/bash^M: bad interpreter: No such file or directory