这是我参与2022首次更文挑战的第24天,活动详情查看:2022首次更文挑战
今天处理一个遗留项目的问题,有一个 Spring Boot 项目部署在一台客户内网的物理服务器上,最近由于一些原因,服务器经常会重启,每次重启后需要手动启动 Spring Boot 的工程,因此我需要将其配置成开启自启动的服务。
完成这件事需要借助 systemd
。
它提供了一套系统启动和管理的解决方案。根据惯例,在 Linux 中,d
一般表示守护进程(daemon),比如 httpd
等。
要让一个 Spring Boot 服务随系统启动,最简单的办法就是通过 systemd
将其配置成一个系统服务。
首先,需要编写 Spring Boot 应用的启动、停止、重启三个脚本,我们的程序 JAR 包是 /path/to/xxx.jar
。
start.sh
:
#!/bin/bash
export JAVA_HOME=/usr/java/jdk1.8.0_131
export PATH=$JAVA_HOME/bin:$PATH
APP_NAME=xxx
nohup java -jar /path/to/xxx.jar.jar > xxx.log 2>&1 &
echo "$APP_NAME is running"
stop.sh
:
#!/bin/bash
APP_NAME=xxx
pid=`ps -ef | grep $APP_NAME | grep -v grep | awk '{print $2}'`
if [ -z "${pid}" ]; then
echo "$APP_NAME is not running"
else
echo "kill thread...$pid"
kill -9 $pid
fi
restart.sh
:
#!/bin/bash
export JAVA_HOME=/usr/java/jdk1.8.0_131
export PATH=$JAVA_HOME/bin:$PATH
APP_NAME=xxx
pid=`ps -ef | grep $APP_NAME | grep -v grep | awk '{print $2}'`
if [ -z "${pid}" ]; then
echo "$APP_NAME is not running"
else
echo "kill thread...$pid"
kill -9 $pid
fi
nohup java -jar /path/to/xxx.jar > xxx.log 2>&1 &
echo "$APP_NAME is running"
以上三个脚本:
start.sh
是启动脚本,提供 Java 的路径,执行 JAR 文件的启动命令,输出信息。stop.sh
是停止脚本,通过ps
命令,找到程序对应进程的 PID,如果不存在,说明程序没有运行,不要任何操作,如果存在,则用kill
命令将其杀掉。restart.sh
是重启脚本,就是将以上两者结合,先终止程序,再启动。
将这三个脚本放在 /path/to/bin/
目录中,有了以上三个脚本,现在我们配置系统服务(假设服务命名为 xxx
)。
在 /usr/lib/systemd/system/
目录中,创建 xxx.service
文件,其内容为:
[Unit]
Description=xxx
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
ExecStart=/path/to/bin/start.sh
ExecReload=/path/to/bin/restart.sh
ExecStop=/path/to/bin/stop.sh
PrivateTmp=true
[Install]
WantedBy=multi-user.target
在这个文件中,有三个部分:
- Unit 区块中,包含了描述内容和启动顺序的配置,After 表示在这些服务启动之后启动。
- Service 区块主要配置启动行为,使用了之前的三个脚本文件,分别作为服务的启动、终止、重启的脚本。
- Install 区块配置如何安装这个配置文件,WantedBy=multi-user.target 表示这个服务所在的 Target 是 multi-user.target。
有了这个配置文件,就可以使用一下命令来操作这个服务:
# 启动服务
systemctl start xxx
# 停止服务
systemctl stop xxx
# 重启服务
systemctl restart xxx
# 查看启动状态
systemctl status xxx
如果要让服务随系统启动,只需要执行如下命令:
systemctl enable xxx
如果要取消随系统启动:
systemctl disable xxx