1.创建一个project.sh 文件,写入springboot启动脚本
脚本如下:
#!/bin/bash
# jar包的名字
APP_NAME=project
# 环境配置文件,如application-dev.yml,pro,test等,结合自己项目使用
PROFILE=pro
JAR_NAME=$APP_NAME\.jar
PID=$APP_NAME\.pid
#PROJ_HOME=$(pwd)
PROJ_HOME=/www/javaserver/dietserver/ #之前用$(pwd)执行不起来,换乘实际路径了,jar包存放路径
#export JRE_HOME=${JAVA_HOME}/jre #用宝塔安装的JAVA_HOME,echo是空的,所以直接改成了绝对路径,如下
export JRE_HOME=/usr/lib/jvm/jre
# 这个是jar包的路径需要根据自己的情况配置,logs为日志存储路径
APP_HOME=$PROJ_HOME/
LOG_PATH=$APP_HOME/logs
# 创建log路径
if [ ! -d $LOG_PATH ]; then
mkdir $LOG_PATH
fi
# GC日志参数
GC_LOG_OPTS=" -XX:+PrintGC -XX:+PrintGCDetails -Xloggc:$LOG_PATH/gc-%t.log"
# GC收集器参数
GC_OPTS="-XX:+UseConcMarkSweepGC"
# 其他参数
OTHER_OPTS="-Dspring.profiles.active=$PROFILE"
# JVM 启动参数
JVM_OPTIONS="-server -Xms64m -Xmx64m -XX:MetaspaceSize=16m $GC_OPTS $GC_LOG_OPTS $OTHER_OPTS"
# 使用说明,用来提示输入参数
usage() {
echo "Usage: demogc.sh [start|stop|restart|status]"
exit 1
}
# 检查程序是否在运行
is_exist() {
pid=$(ps -ef | grep $APP_HOME/$JAR_NAME | grep -v grep | awk '{print $2}')
#如果不存在返回1,存在返回0
if [ -z "${pid}" ]; then
return 1
else
return 0
fi
}
# 启动方法
start() {
is_exist
if [ $? -eq "0" ]; then
echo "WARN: $JAR_NAME is already running PID=${pid}"
else
echo "JVM_OPTIONS : "
echo $JVM_OPTIONS | sed 's/ /\n/g '
nohup ${JRE_HOME}/bin/java -jar $JVM_OPTIONS $APP_HOME/$JAR_NAME >>$LOG_PATH/stdout.log 2>&1 &
echo $! >$PID
echo "INFO: start $JAR_NAME successed PID=$!"
fi
}
# 停止方法
stop() {
#is_exist
pidf=$(cat $PID)
echo "INFO: app PID = $pidf begin kill $pidf"
kill "$pidf"
rm -rf $PID
sleep 2
is_exist
if [ $? -eq "0" ]; then
echo "INFO: app 2 PID = ${pid} begin kill -9 ${pid}"
kill -9 ${pid}
sleep 2
echo "INFO: $JAR_NAME process stopped ---"
else
echo "INFO: $JAR_NAME is not running ---"
fi
}
# 输出运行状态
status() {
is_exist
if [ $? -eq "0" ]; then
echo "INFO: $JAR_NAME is running PID is $pid"
else
echo "WARN: $JAR_NAME is not running"
fi
}
# 重启
restart() {
stop
start
}
case "$1" in
"start")
start
;;
"stop")
stop
;;
"status")
status
;;
"restart")
restart
;;
*)
usage
;;
esac
exit 0
2.配置脚本可执行性
chmod +x /springboot/test/project.sh
3.输入sh project.sh start 验证脚本是否可行。可行进入下一步,不可行根据日志调整
sh project.sh start
4.在/etc/systemd/system/文件夹中新建 project.service 服务文件,写入内容如下
[Unit]
Description=project test
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
User=root
ExecStart=sh /springboot/test/project.sh start
ExecReload=sh /springboot/test/project.sh restart
ExecStop=sh /springboot/test/project.sh stop
[Install]
WantedBy=multi-user.target
5.重载配置
systemctl daemon-reload
6.设置project服务自动启动
systemctl enable project.service
7.查看自动启动服务中,有没有自己的项目
systemctl list-unit-files|grep enabled
致此设置springboot jar项目自启动已经完成,输入reboot试一下吧!
常用指令
# 开机启动
systemctl enable project.service
# 启动
systemctl start project.service
# 关闭
systemctl stop project.service
# 重启
systemctl restart project.service
# 查看状态
systemctl status project.service
# 重新加载配置
systemctl daemon-reload
注意:第2和5步中很重要,一定要执行。
一开始部署时找的资料,很多没提到chmod +x /springboot/test/project.sh,总是启动不了,日志都没有。
具体原因也不清楚。有高手希望能评论指点下,谢啦:)
如果提示:
See system logs and 'systemctl status xxx.service' for details.错误可输入查看错误内容
解决方法就是看日志 cat /var/log/messages | grep project
也可以tail -f /var/log/messages 跟踪日志的变化
查看后的值是因为路径错误的问题,错误消息如下
Sep 1 23:05:21 localhost systemd: Configuration file /etc/systemd/system/project.service is marked executable. Please remove executable permission bits. Proceeding anyway.
Sep 1 23:22:32 localhost systemd: [/etc/systemd/system/project.service:8] Executable path is not absolute, ignoring: sh /www/springboot/project.sh start
Sep 1 23:22:32 localhost systemd: [/etc/systemd/system/project.service:9] Executable path is not absolute, ignoring: sh /www/springboot/project.sh restart
Sep 1 23:22:32 localhost systemd: [/etc/systemd/system/project.service:10] Executable path is not absolute, ignoring: sh /www/springboot/project.sh stop
Sep 2 00:13:33 localhost systemd: project.service lacks both ExecStart= and ExecStop= setting. Refusing.
查了很长时间也没发现明显错误,后来将sh换成完整执行路径/usr/bin/bash就可以了,就是把project.service内容换为如下(这个问题只是在centos7中碰到)
[Unit]
Description=project test
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
User=root
ExecStart=/usr/bin/bash /springboot/test/project.sh start
ExecReload=/usr/bin/bash /springboot/test/project.sh restart
ExecStop=/usr/bin/bash /springboot/test/project.sh stop
[Install]
WantedBy=multi-user.target
参考:
Springboot项目设置服务,开机自启动(centos) https://blog.youkuaiyun.com/abelethan/article/details/111505062
springboot自启动脚本shell、systemctl以及service文件Environment用法 https://blog.youkuaiyun.com/weixin_39992480/article/details/102761989