相关文章:
在日常开发中,我们经常会将项目打成 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 上运行的话,会报以下异常
-
这是因为 Windows 和 Linux 下的换行回车格式不同,Windows 下的格式为 dos,Linux 下的格式为 unix,因此我们需要进行格式转换
-
在 vim 命令模式中,我们可以使用
:set ff
命令来查看当前文件的 format 格式 (此时为 dos) -
然后通过
:set ff=unix
命令将 dos 修改为 unix,保存并退出 (此时为 unix)
-
-
此时我们再启动脚本,就不会有问题了