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

相关推荐
小羊没烦恼!2 天前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
俊昭喜喜里2 天前
java中的继承和多态的区别
java
小羊没烦恼!2 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
未济2 天前
linux 配置环境变量
linux
傲世仙尊2 天前
目录即文件-Ext文件系统收尾篇
linux·c语言
譕痕2 天前
JSONObject与JSONArray封装数据格式区别
java·json
胡写代码2 天前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖2 天前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商
此时不提桶,更待何时2 天前
01-06-A-JVM排查实战详解
java·jvm
vipxieliang2 天前
ValidX 在 DDD 领域驱动设计中的实践
java·spring boot