在日常开发中,我们经常会将项目打成 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)
- 此时我们再启动脚本,就不会有问题了
四、参考资料
- [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