如何将java -jar启动的服务设置为systemd服务管理方式

 更新时间:2025年01月03日 15:09:01   作者:学亮编程手记  
本文详细介绍了如何将Java应用程序配置为由systemd管理的服务,包括创建和配置.service文件的步骤,以及如何启动、停止和查看服务状态

要将一个使用 java -jar 命令启动的服务设置为由 systemd 进行管理,你需要创建一个 .service 文件并将其放置在 /etc/systemd/system/ 目录下。

以下是创建和配置这样一个服务文件的详细步骤:

步骤 1: 准备工作

确定Java环境

确保系统中已经安装了Java,并且知道Java的安装路径(如 /usr/lib/jvm/java-1.8.0-openjdk-amd64/usr/java/jdk1.8.0_211)。可以通过命令 which java 查找实际的可执行文件路径。

准备JAR文件

确认你的Java应用程序的JAR文件路径,例如 /opt/services/myapp/myapp.jar。确保该JAR文件具有适当的权限,使得 systemd 用户(通常为 root 或者 system 用户组)能够访问。

步骤 2: 创建.service文件

使用文本编辑器(如 vi, nano, 或 gedit),创建一个名为 myapp.service 的文件,将其保存在 /etc/systemd/system/ 目录下。

以下是一个基本的 .service 文件模板:

[Unit]
Description=My Java Application Service
After=network.target

[Service]
User=<非root用户>  # 如果需要以非root用户运行,填写用户名;否则可以省略此行
Group=<用户组>     # 如果需要指定用户组,填写用户组名;否则可以省略此行

Restart=on-failure  # 当服务崩溃时自动重启
RestartSec=10s      # 重启前等待10秒

Environment="JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-amd64"
Environment="JAR_FILE=/opt/services/myapp/myapp.jar"

ExecStart=/usr/bin/java -jar $JAR_FILE
ExecStop=/bin/kill -SIGTERM $MAINPID

[Install]
WantedBy=multi-user.target

说明:

[Unit] 部分:

  • Description: 提供服务的简短描述。
  • After: 指定服务应在哪些服务之后启动,这里设置为在网络服务 (network.target) 完成后启动。

[Service] 部分:

  • UserGroup: 如果希望服务以非 root 用户和用户组运行,指定相应的用户名和用户组名。
  • RestartRestartSec: 设置当服务崩溃时自动重启策略,这里是 on-failure 表示失败时重启,RestartSec 指定了重启前等待的时间。
  • Environment: 设置环境变量,这里指定了 JAVA_HOME(Java安装路径)和 JAR_FILE(应用程序JAR文件路径)。
  • ExecStart: 定义启动服务的命令,使用 java -jar 命令启动指定的JAR文件,通过 $JAR_FILE 引用之前定义的环境变量。
  • ExecStop: 定义停止服务的命令,这里使用 kill 命令发送 SIGTERM 信号给主进程ID($MAINPID),以优雅地关闭服务。

[Install] 部分:

  • WantedBy: 指定服务应随哪个目标(target)启动。
  • 这里设置为 multi-user.target,意味着在多用户系统(非单用户模式或图形界面)启动时,该服务会被自动启动。

步骤 3: 配置服务

更新服务配置

执行以下命令,使 systemd 重新加载配置文件:

sudo systemctl daemon-reload

启用服务

若要让服务在系统启动时自动运行,执行:

sudo systemctl enable myapp.service

启动服务

立即启动服务:

sudo systemctl start myapp.service

检查服务状态

确认服务是否正常运行:

sudo systemctl status myapp.service

如果一切正常,你应该能看到服务状态为 active (running)

附加说明

日志管理

默认情况下,服务的标准输出和错误输出将被重定向到 systemd 的 journal。你可以使用 journalctl 命令查看服务的日志:

journalctl -u myapp.service

自定义启动参数

如果你的Java应用需要额外的启动参数,可以在 ExecStart 行中直接添加,例如:

ExecStart=/usr/bin/java -jar $JAR_FILE --param1=value1 --param2=value2

权限与限制

根据需要,你还可以在 [Service] 部分设置资源限制(如内存、CPU限制)、工作目录、文件描述符限制等。查阅 systemd.exec(5) 手册页了解更多信息。

完成以上步骤后,你的Java应用程序就已成功配置为由 systemd 管理的服务,可以方便地进行启动、停止、重启以及查看状态和日志。

需要使用nohup保持后台运行吗

在使用 systemd 管理服务的情况下,通常不需要使用 nohup 命令来保持服务在后台运行。

systemd 已经提供了完善的后台服务管理机制,它能够确保服务进程在后台持续运行,并在必要时根据配置自动重启服务。

在上述 myapp.service 示例中,ExecStart 参数定义了启动服务的命令:

ExecStart=/usr/bin/java -jar $JAR_FILE

这里直接使用 java -jar 命令启动Java应用程序,无需加上 nohupsystemd 会负责管理这个进程的生命周期,确保它在后台运行,不受终端会话影响,并在服务停止时正确清理资源。

因此,当您按照上述步骤将Java应用程序配置为 systemd 服务后,就不需要再使用 nohup 命令来保持其后台运行。systemd 提供的稳定性和可靠性足以满足大多数生产环境的需求。

如果您在Jenkins Pipeline中需要启动这个服务,可以直接调用 systemctl start myapp.service,而不是使用 nohup java -jar ... &

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java内部类的全限定名规律代码示例

    Java内部类的全限定名规律代码示例

    这篇文章主要介绍了Java内部类的全限定名规律代码示例,具有一定借鉴价值,需要的朋友可以参考下。
    2017-12-12
  • SpringCloud中的Hystrix保护机制详解

    SpringCloud中的Hystrix保护机制详解

    这篇文章主要介绍了SpringCloud中的Hystrix保护机制详解,Hystrix,英文意思是豪猪,全身是刺,看起来就不好惹,是一种保护机制,Hystrix也是Netflix公司的一款组件,需要的朋友可以参考下
    2023-12-12
  • Spring Security中successHandler和failureHandler使用方式

    Spring Security中successHandler和failureHandler使用方式

    这篇文章主要介绍了Spring Security中successHandler和failureHandler使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • MyBatis-plus数据库字段排序不准确的解决

    MyBatis-plus数据库字段排序不准确的解决

    这篇文章主要介绍了MyBatis-plus数据库字段排序不准确的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-02-02
  • SpringBoot排除自动加载数据源方式

    SpringBoot排除自动加载数据源方式

    这篇文章主要介绍了SpringBoot排除自动加载数据源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-05-05
  • HashMap 和 HashSet的区别

    HashMap 和 HashSet的区别

    本文主要介绍HashMap 和 HashSet的区别,这里整理了详细的资料来说名两者的区别,并说明如何使用该方法,有需要的小伙伴可以参考下
    2016-09-09
  • Java中的BigDecimal精度运算详解

    Java中的BigDecimal精度运算详解

    这篇文章主要介绍了Java中的BigDecimal精度运算详解,Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算,双精度浮点型变量double可以处理16位有效数,但在实际应用中,可能需要对更大或者更小的数进行运算和处理,需要的朋友可以参考下
    2023-10-10
  • SpringCloud灰度发布的设计与实现详解

    SpringCloud灰度发布的设计与实现详解

    这篇文章主要介绍了SpringCloud灰度发布的设计与实现详解,灰度从字面意思理解就是存在于黑与白之间的一个平滑过渡的区域,所以说对于互联网产品来说,上线和未上线就是黑与白之分,而实现未上线功能平稳过渡的一种方式就叫做灰度发布,需要的朋友可以参考下
    2023-09-09
  • 浅谈Spring refresh的工作流程

    浅谈Spring refresh的工作流程

    这篇文章主要介绍了浅谈Spring refresh的工作流程,refresh 是 AbstractApplicationContext 中的一个方法,负责初始化 ApplicationContext容器,让我们一起来学习一下吧
    2023-04-04
  • springboot开发扩展springmvc实现解析

    springboot开发扩展springmvc实现解析

    这篇文章主要介绍了springboot开发扩展springmvc实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02

最新评论