Linux 下将 Java Jar 包配置为开机自启(使用 systemd)

Linux 下将 Java Jar 包配置为开机自启(使用 systemd)

一、背景

我们经常使用 nohup java -jar ... & 的方式在后台启动 Spring Boot 等 Jar 包应用。

但这种方式在服务器重启后不会自动启动,需要手动再次执行命令。

本教程将以一个实际命令为例,演示如何将其配置为 系统服务 ,实现 开机自启、异常重启、日志管理

示例原始命令:

bash 复制代码
nohup java -Dfile.encoding=UTF-8 -Dspring.config.location=file:/home/fr1511b/ishz/application.yml -jar VSL-1.0-SNAPSHOT.jar > app.log 2>&1 &
  • 用户:fr1511b
  • 工作目录:/home/fr1511b/ishz
  • 日志文件:/home/fr1511b/ishz/app.log

二、环境准备

  • 操作系统:CentOS 7+ / Ubuntu 16.04+ / Debian 8+ (支持 systemd)
  • Java 环境已安装,可通过 which java 查看 Java 路径
  • 已有一个可运行的 Jar 包

确认 Java 路径:

bash 复制代码
which java
# 输出示例:/usr/bin/java

三、方法一:使用 systemd 服务(强烈推荐)

1. 创建服务单元文件

使用 root 权限在 /etc/systemd/system/ 下创建服务文件,名称可自定义,例如 vsl.service

bash 复制代码
sudo vim /etc/systemd/system/vsl.service

填入以下内容(根据实际情况修改路径和用户):

ini 复制代码
[Unit]
Description=VSL Java Application
After=network.target

[Service]
Type=simple
User=fr1511b
WorkingDirectory=/home/fr1511b/ishz
ExecStart=/usr/bin/java -Dfile.encoding=UTF-8 -Dspring.config.location=file:/home/fr1511b/ishz/application.yml -jar /home/fr1511b/ishz/VSL-1.0-SNAPSHOT.jar
Restart=on-failure
RestartSec=10
StandardOutput=append:/home/fr1511b/ishz/app.log
StandardError=append:/home/fr1511b/ishz/app.log

[Install]
WantedBy=multi-user.target
参数详解:
  • User:指定运行服务的用户,避免使用 root 提升安全性。
  • WorkingDirectory:设置工作目录,便于应用读取相对路径的文件。
  • ExecStart:就是原本的 Java 启动命令,不需要nohup&,systemd 会自动后台运行。
  • Restart=on-failure:进程异常退出时自动重启。
  • RestartSec=10:重启间隔 10 秒,防止频繁失败占用资源。
  • StandardOutputStandardError:将标准输出和错误都追加到指定的日志文件中(替代原来的 > app.log 2>&1)。
    如果不需要文件日志,可省略这两行,用 journalctl 查看日志。

提示 :如果 Java 不在 /usr/bin/java,请用 which java 的结果替换,或者通过 Environment=JAVA_HOME=... 指定环境变量。

2. 重载 systemd 配置

bash 复制代码
sudo systemctl daemon-reload

3. 设置开机自启

bash 复制代码
sudo systemctl enable vsl.service

4. 启动服务(立即运行,无需重启系统)

bash 复制代码
sudo systemctl start vsl.service

5. 检查服务状态

bash 复制代码
sudo systemctl status vsl.service

看到 active (running) 即表示启动成功。


四、服务日常管理命令

操作 命令
启动服务 sudo systemctl start vsl
停止服务 sudo systemctl stop vsl
重启服务 sudo systemctl restart vsl
查看状态 sudo systemctl status vsl
查看实时日志(journal) sudo journalctl -u vsl -f
查看文件日志 tail -f /home/fr1511b/ishz/app.log
禁止开机自启 sudo systemctl disable vsl

五、方法二:使用 /etc/rc.local(备选,不推荐)

如果系统不支持 systemd,或临时需要快速实现,可编辑 /etc/rc.local 文件。

bash 复制代码
sudo vim /etc/rc.local

exit 0 之前添加:

bash 复制代码
su - fr1511b -c 'cd /home/fr1511b/ishz && nohup java -Dfile.encoding=UTF-8 -Dspring.config.location=file:/home/fr1511b/ishz/application.yml -jar VSL-1.0-SNAPSHOT.jar > app.log 2>&1 &'

确保该文件具有可执行权限:

bash 复制代码
sudo chmod +x /etc/rc.local

缺点

  • 无法方便地 start/stop/status 管理
  • 异常退出不会自动重启
  • 日志管理不灵活

六、常见问题

Q1:服务启动后马上就停止了?

检查 status 输出的错误日志。常见原因:

  • Java 命令路径不对,用 which java 确认。
  • Jar 包路径错误或文件不存在。
  • 配置文件 application.yml 有错误导致应用启动失败。

Q2:如何更新 Jar 包并重启服务?

bash 复制代码
# 替换新的 Jar 包
cp /path/to/new/VSL-1.0-SNAPSHOT.jar /home/fr1511b/ishz/
# 重启服务
sudo systemctl restart vsl

Q3:想要使用自己安装的特定 JDK 版本?

[Service] 中添加环境变量,例如:

ini 复制代码
Environment=JAVA_HOME=/usr/local/jdk-17
ExecStart=${JAVA_HOME}/bin/java -jar ...

Q4:应用需要读取环境变量怎么办?

使用 EnvironmentEnvironmentFile 指定,例如:

ini 复制代码
EnvironmentFile=/home/fr1511b/ishz/env.conf

然后在 env.conf 中写入 KEY=value 形式的变量。


七、总结

通过 systemd 管理 Jar 包应用是生产环境的标准做法,不仅实现了开机自启,还提供了进程守护、日志统一管理、方便启停等优势。

只需简单的几步即可替代传统的 nohup 手动启动方式,推荐大家使用。

相关推荐
吴声子夜歌11 分钟前
Guava——并发(一)
java·guava
天空属于哈夫克314 分钟前
企业微信API:企业微信如何实现自动化运营?
java·自动化·企业微信
好评12423 分钟前
【Linux】应用层自定义协议与序列化
linux·运维·网络
lhldsg23 分钟前
相册印刷实战指南:从设计规范到系统落地全流程解析
java·小程序·架构·设计规范
草青工作室25 分钟前
java-不携带Token也能“打“自己的接口:一个绕开网关鉴权、用 URL 直接调度 SpringMVC 方法的轻量级定时任务方案
java·开发语言
赴生-27 分钟前
Lunix 操作系统 基本指令(一)
linux
霸道流氓气质32 分钟前
Spring AI提示词模板与动态变量替换
java·python·spring
oushaojun234 分钟前
大厂 C++ 后端面试:深度拆解 Linux页表 机制(转)
linux
励志不掉头发的内向程序员34 分钟前
【LibreCAD 2D架构】从鼠标点击到屏幕像素:LibreCAD绘图架构全链路解析之Action与命令系统
linux·开发语言·c++·qt·学习·系统架构
Object_SC34 分钟前
java 中的泛型
java