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 秒,防止频繁失败占用资源。
  • StandardOutput 和 StandardError:将标准输出和错误都追加到指定的日志文件中(替代原来的 > 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:应用需要读取环境变量怎么办?

使用 Environment 或 EnvironmentFile 指定,例如:

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

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


七、总结

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

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

相关推荐
哦虎!2 小时前
【JavaEE】网络初识
java
Android系统攻城狮2 小时前
Linux Gstreamer深度解析之gst_audio_ring_buffer_delay调用流程与实战(七十二)
linux·运维·服务器·gstreamer音视频·音视频进阶
for_ever_love__2 小时前
MySQL ORDER BY 排序优化:从 Using filesort 到索引有序扫描(含双路 / 单路排序原理)
java·mysql·优化·存储·by·order·filesort
快乐的韭菜根根3 小时前
ubuntu 安装slurm并配置
linux·运维·ubuntu
我是人✓3 小时前
Java文件上传三方式对比:从传统到SpringBoot
java·开发语言
欣栀♡3 小时前
JVM 频繁 Full GC 先看日志括号里的 cause,jstat 的 FGC 在 JDK 8 上会骗人
java·jvm
IT研究室4 小时前
最新计算机毕业设计选题推荐-基于spring boot的葡萄酒文化宣传网站-网站-文档指导-Java-springboot
java·spring boot·课程设计
慧都小项4 小时前
MyEclipse 中创建和测试 JAX-RS REST 接口:从项目配置到 REST Explorer
java·restful·myeclipse·jax-rs
Wang's Blog4 小时前
Java 项目实战: 交友项目 - 入门案例:编写 Dubbo 服务提供者
java·dubbo·交友
秋饼4 小时前
Spring AI 2.0 结构化输出企业级实战:从 BeanOutputConverter 源码到生产级解析容错
java·ai·技术分享·后端开发