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 手动启动方式,推荐大家使用。

相关推荐
DFT计算杂谈3 小时前
无 Root 权限在 Tesla K80 零门槛部署 DeepSeek 大模型
linux·服务器·网络·数据库·机器学习
维天说4 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json
Zhang~Ling4 小时前
从 fopen 到 struct file:从零开始拆解 Linux 文件 I/O
linux·运维·服务器
DeeplyMind4 小时前
Linux 深入 per-VMA lock:Linux 缺页路径如何摆脱 mmap_lock
linux·per-vma lock
爱写代码的森4 小时前
蒙三方库 | harmony-utils之FileUtil文件重命名与属性查询详解
linux·运维·服务器·华为·harmonyos·鸿蒙·huawei
Zane19944 小时前
并发 vs 并行:别再傻傻分不清了,一文讲透 Java 并发编程的第一课
java·后端
噢,我明白了5 小时前
java中Excel的导入和导出(EasyExcel)
java·开发语言·excel
吠品5 小时前
Zabbix Web界面误报Server未运行的排查与解决
java·服务器·数据库
XMAIPC_Robot5 小时前
软硬协同实时控制|RK3588业务调度+FPGA硬件时序,ethercat实现半导体设备微秒级响应(125us)
linux·arm开发·人工智能·fpga开发
啊湘5 小时前
天气查询API接口 按月Token鉴权 实时天气 物联网可用 文档齐全
java·后端·struts