前言
springboot项目一般都是打一个jar然后放在我们的Linux服务器上边进行部署,一般我们都会写一个java启动脚本,方便我们进行项目的启动,停止,重启,提高部署效率。今天我们就写一个简单的linux下的springboot项目的脚本。
一、脚本中常用命令介绍
- ps 命令:
查看进程。假如我们要查看java进程,使用命令ps -ef | grep java
[root@VM-24-4-centos program]# ps -ef | grep java
root 1143951 1 2 17:20 pts/0 00:00:16 java -jar /usr/local/program/sms-0.0.1-SNAPSHOT.jar
root 1146438 1063826 0 17:33 pts/0 00:00:00 grep --color=auto java
或者使用ps -aux | grep java
[root@VM-24-4-centos program]# ps -aux | grep java
root 1143951 2.3 9.6 2441752 179924 pts/0 Sl 17:20 0:16 java -jar /usr/local/program/sms-0.0.1-SNAPSHOT.jar
root 1146237 0.0 0.0 15456 1128 pts/0 R+ 17:32 0:00 grep --color=auto java
Linux下显示系统进程的命令ps,最常用的有ps -ef 和ps aux。这两个到底有什么区别呢?两者没太大差别,讨论这个问题,要追溯到Unix系统中的两种风格,System V风格和BSD 风格,ps aux最初用到Unix Style中,而ps -ef被用在System V Style中,两者输出略有不同。现在的大部分Linux系统都是可以同时使用这两种方式的。个人推荐ps -ef 这种形式。
- pwd
输出当前路径
[root@VM-24-4-centos program]# pwd
/usr/local/program
- echo
输出文本或者变量值
[root@VM-24-4-centos program]# echo $JAVA_HOME
/opt/java/jdk1.8.0_311
[root@VM-24-4-centos program]# echo "123"
123
-
nohup
英文全称 no hang up(不挂起),用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。在默认情况下(非重定向时),会输出一个名叫 nohup.out 的文件到当前目录下,如果当前目录的 nohup.out 文件不可写,输出重定向到 $HOME/nohup.out 文件中。[root@VM-24-4-centos program]# nohup java -jar sms-0.0.1-SNAPSHOT.jar > usr/local/sms.txt 2>&1 & [2] 1149114
解释:上边的命令是指启动java项目。
nohup表示永久运行。&表示后台运行,> 代表将输出结果或者日志重定向到 usr/local/sms.txt文件下
0 – stdin (standard input,标准输入)
1 – stdout (standard output,标准输出) 系统默认值是1
2 – stderr (standard error,标准错误输出) -
kill
杀死正在运行的进程,一般和ps命令一起使用,先通过ps命令获取进程编号,再通过kill -9 pid杀死进程
二、编写脚本
0.变量介绍
APP_NAME:表示你要执行的jar包,我的测试的jar包是 sms-0.0.1-SNAPSHOT.jar
#这里替换为你自己的执行程序
APP_NAME=sms-0.0.1-SNAPSHOT.jar
APP_DIR:jar包或者程序所在的路径,可以写死,或者使用pwd命令获取。使用pwd命令要注意一定要加上``
这个引号。位于键盘Tab上边的按键上。
#jar包所在的路径,使用这种方式的话不需要将jar包和脚本放在同一级目录
APP_DIR=/usr/local
或者
#一定要加上``这个引号
APP_DIR=`pwd`
1.使用说明
使用说明很简单,就是告诉用户怎么使用这个脚本。
比如:执行命令 sh sms.sh start启动,下边的脚本有详细的注释,就不一一介绍了。
#使用说明,用来提示输入参数
usage() {
# 使用sh sms.sh start|stop|restart|status来操作项目:启动|停止|重启|查看项目启动状态
echo "Usage: sh sms.sh [start|stop|restart|status]"
exit 1
}
2.检查程序是否运行
使用命令ps -ef 来查看进程并获取进程编号,如果不存在返回1,存在返回0
#检查程序是否在运行
is_exist(){
# 获取进程编号,并将进程编号赋值给pid变量
pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}' `
#输出进程编号
echo "ps number is: ${pid}"
#如果不存在返回1,存在返回0
if [ -z "${pid}" ]; then
return 1
else
return 0
fi
}
3.启动
先调用第二步的is_exist看进程号是否存在,存在就输出已经在运行,不存在的话使用nohup进行启动并输出到sms.txt文件下。
#启动方法
start(){
#调用is_exist看进程号是否存在
is_exist
if [ $? -eq "0" ]; then
#存在,输出已经在运行
echo "${APP_NAME} is already running. pid=${pid} ."
else
#不存在, 使用nohup进行启动并输出到sms.txt文件下。
nohup java -jar $APP_DIR/$APP_NAME > $APP_DIR/sms.txt 2>&1 &
# 输出程序启动成功
echo "${APP_NAME} start success"
fi
}
4.停止
同样先调用is_exist方法看程序是否在运行,运行使用命令杀死进程,没有运行输出序没有在运行。
#停止方法
stop(){
#调用is_exist看进程号是否存在
is_exist
if [ $? -eq "0" ]; then
#存在 使用命令杀掉此程序的进程,pid在is_exist已经获取
kill -9 $pid
else
#不存在 输出程序没有在运行
echo "${APP_NAME} is not running"
fi
}
5.重启
重启就简单了,先调用st停止方法,再调用启动方法。
#重启
restart(){
stop
start
}
6.运行状态
先调用is_exist方法看程序是否在运行,运行输出正在运行,没有运行输出没有运行即可。
#输出运行状态
status(){
#调用is_exist看进程号是否存在
is_exist
if [ $? -eq "0" ]; then
#运行输出正在运行
echo "${APP_NAME} is running. Pid is ${pid}"
else
#没有运行输出没有运行
echo "${APP_NAME} is NOT running."
fi
}
6.参数输入
根据输入参数,选择执行对应方法,不输入则执行使用说明
#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
*)
usage
;;
esac
三、完整脚本和使用
完整脚本
#!/bin/bash
#这里可替换为你自己的执行程序,其他代码无需更改
APP_NAME=sms-0.0.1-SNAPSHOT.jar
APP_DIR=/usr/local/program
#APP_DIR=`pwd`
#使用说明,用来提示输入参数
usage() {
echo "Usage: sh sms.sh [start|stop|restart|status]"
exit 1
}
#检查程序是否在运行
is_exist(){
pid=`ps -ef|grep $APP_NAME|grep -v grep|awk '{print $2}' `
echo "ps number is: ${pid}"
#如果不存在返回1,存在返回0
if [ -z "${pid}" ]; then
return 1
else
return 0
fi
}
#启动方法
start(){
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} is already running. pid=${pid} ."
else
nohup java -jar $APP_DIR/$APP_NAME > $APP_DIR/log.out 2>&1 &
#nohup java -jar $APP_DIR/$APP_NAME
echo "${APP_NAME} start success"
fi
}
#停止方法
stop(){
is_exist
if [ $? -eq "0" ]; then
kill -9 $pid
else
echo "${APP_NAME} is not running"
fi
}
#输出运行状态
status(){
is_exist
if [ $? -eq "0" ]; then
echo "${APP_NAME} is running. Pid is ${pid}"
else
echo "${APP_NAME} is NOT running."
fi
}
#重启
restart(){
stop
start
}
#根据输入参数,选择执行对应方法,不输入则执行使用说明
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
*)
usage
;;
esac
脚本编写完成后,可以使用命令sh xxx.sh执行,也可以使用./xxx.sh执行。
sh xxx.sh与./xxx.sh区别
sh xxx.sh 是不需要有执行权限
./xxx.sh 是需要有执行权限的,可以通过 chmod +x xxx.sh 赋予权限。
脚本执行
我的已经授权,所以我可以使用/xxx.sh执行。
先看一下java程序是否启动:
[root@VM-24-4-centos program]# ps -ef | grep java
root 1161218 1063826 0 18:49 pts/0 00:00:00 grep --color=auto java
没有启动,接下来我们来启动:
[root@VM-24-4-centos program]# ./sms.sh start
ps number is:
sms-0.0.1-SNAPSHOT.jar start success
[root@VM-24-4-centos program]# ps -ef | grep java
root 1161430 1 95 18:50 pts/0 00:00:04 java -jar /usr/local/program/sms-0.0.1-SNAPSHOT.jar
root 1161452 1063826 0 18:50 pts/0 00:00:00 grep --color=auto java
启动成功。我们再停止:
[root@VM-24-4-centos program]# ./sms.sh stop
ps number is: 1161430
[root@VM-24-4-centos program]# ps -ef | grep java
root 1161647 1063826 0 18:51 pts/0 00:00:00 grep --color=auto java
停止了,我们先启动,在进行重启:
[root@VM-24-4-centos program]# ./sms.sh start
ps number is:
sms-0.0.1-SNAPSHOT.jar start success
[root@VM-24-4-centos program]# ./sms.sh restart
ps number is: 1161829
ps number is:
sms-0.0.1-SNAPSHOT.jar start success
[root@VM-24-4-centos program]# ps -ef | grep java
root 1161862 1 99 18:52 pts/0 00:00:04 java -jar /usr/local/program/sms-0.0.1-SNAPSHOT.jar
root 1161881 1063826 0 18:52 pts/0 00:00:00 grep --color=auto java
到这里,我们的脚本已经验证完毕,收工!有任何问题,欢迎探讨!