SpringBoot项目Jar包使用systemctl运行过程
作者:太自由
1. 前言
SpringBoot项目打成jar包后,可以直接使用 java -jar xxx.jar 启动。但是为了方便启动和停止服务,通常我们会写两个脚本,分别是启动脚本 start.sh 和 停止脚本 shutdown.sh(这两个脚本内容我们下文会实现);
再进一步的做法是可以把我们的服务添加成系统服务,使用systemctl 进行管理,就像使用 systemctl status firewalld.service 一样。
2. 创建SpringBoot项目并生成jar包
为了演示,先创建一个最普通的SpringBoot项目,在项目中使用 SLFJ + Logback记录日志。
项目目录结构如下。
3. 使用 java -jar 命令在服务器上运行
3.1 前台运行
前台运行,直接在jar包所在目录执行 java -jar xxx.jar 就可以了,如下所示:
3.2 后台运行(带nohup.out日志)
通常我们是让服务在后台运行,可以使用 nohup java -jar xxx.jar & 运行jar包,如下:
这种直接使用 nohup java -jar xxx.jar & 运行jar包会产生一个 nohup.out日志文件,在项目运行过程中的日志都会追加到这个文件中,时间长了这个文件就会非常大,容易打满磁盘,浪费硬盘存储空间。
3.3 后台运行(不带nohup.out日志)
因为我们的项目通常集成了 SLFJ + Logback 进行日志记录,所以不需要生成这个文件,可以使用如下命令运行jar包。
nohup java -jar xxx.jar >/dev/null 2>&1 &
4. 使用脚本实现启动和停止jar包
每次使用 nohup java -jar xxx.jar >/dev/null 2>&1 & 运行项目太麻烦,并且在关闭服务时,还要先找到这个服务的进程号,然后才能关闭。
所以可以把启动项目和关闭项目写成脚本,每次只要执行脚本就可以了。
4.1 启动服务脚本
启动服务脚本如下:
#!/bin/bash pid=$(pgrep -f 你的jar包名称.jar) if [ -z $pid ];then nohup java -jar 你的jar包名称.jar >/dev/null 2>&1 & else echo "你的jar包名称.jar is already running [pid is $pid]" fi
比如我的启动脚本如下:
启动项目的过程如下:
4.2 停止服务脚本
停止服务脚本如下:
#!/bin/bash pid=$(pgrep -f 你的jar名字.jar) echo $pid if [ -z $pid ];then echo "你的jar名字.jar is not running" else kill -15 $pid fi
比如我的停止服务脚本如下:
执行停止服务脚本过程如下:
5. 使用systemctl 命令管理jar包的启动和停止
5.1 添加到系统服务
(1)写一个服务脚本,名称以 .service结尾 【我写的是 demo-service.service,其内容如下,你可以参照下面的写法,修改成你自己的】
[Unit] Description=demo-service After=syslog.target network.target remote-fs.target nss-lookup.target [Service] Type=simple User=root Group=root WorkingDirectory=/opt/myJar/run_jar ExecStart=/opt/software/jdk/jdk8/jdk1.8.0_221/bin/java -jar /opt/myJar/run_jar/demo-project-1-1.0-SNAPSHOT.jar ExecReload=/bin/kill -s HUP $MAINPID ExecStop=/bin/kill -s QUIT $MAINPID PrivateTmp=true [Install] WantedBy=multi-user.target
(2)把此文件,即demo-service.service 放到 /usr/lib/systemd/system/ 目录下
(3)执行 systemctl daemon-reload 命令
5.2 如何使用
使用请看图中说明。
还可以把启动服务添加到开机自启,执行如下命令,当服务器重启后就会自动启动服务。
systemctl enable demo-service.service
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。