CentOS8中通过systemd(systemctl)实现springboot项目开机自动启动,使用sh脚本

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.csdn.net/abelethan/article/details/111505062
springboot自启动脚本shell、systemctl以及service文件Environment用法 https://blog.csdn.net/weixin_39992480/article/details/102761989

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值