如何将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 ... &

总结

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

相关文章

  • Mybatis批量修改联合主键数据的两种方法

    Mybatis批量修改联合主键数据的两种方法

    最近遇上需要批量修改有联合主键的表数据,找很多资料都不是太合适,最终自己摸索总结了两种方式可以批量修改数据,对Mybatis批量修改数据相关知识感兴趣的朋友一起看看吧
    2022-04-04
  • Java基础之详解HashSet的使用方法

    Java基础之详解HashSet的使用方法

    今天给大家带来的是关于Java基础的相关知识,文章围绕着HashSet的使用方法展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • Spring注解驱动之BeanFactoryPostProcessor原理解析

    Spring注解驱动之BeanFactoryPostProcessor原理解析

    这篇文章主要介绍了Spring注解驱动之BeanFactoryPostProcessor原理,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-09-09
  • 用java实现学生信息管理系统

    用java实现学生信息管理系统

    这篇文章主要为大家详细介绍了java实现学生信息管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-09-09
  • Spring Boot整合MybatisPlus逆向工程(MySQL/PostgreSQL)

    Spring Boot整合MybatisPlus逆向工程(MySQL/PostgreSQL)

    MyBatis-Plus是MyBatis的增强工具,本文主要介绍了Spring Boot整合MybatisPlus逆向工程(MySQL/PostgreSQL),具有一定的参考价值,感兴趣的可以了解一下
    2021-07-07
  • SpringBoot各种参数校验的实例教程

    SpringBoot各种参数校验的实例教程

    经常需要提供接口与用户交互(获取数据、上传数据等),由于这个过程需要用户进行相关的操作,为了避免出现一些错误的数据等,一般需要对数据进行校验,下面这篇文章主要给大家介绍了关于SpringBoot各种参数校验的相关资料,需要的朋友可以参考下
    2022-03-03
  • 一篇文章带你了解JVM内存模型

    一篇文章带你了解JVM内存模型

    本文讲解了Java 内存模型来看看解决可见性、有序性问题的 Java 内存模型(JMM),今天通过本文给大家介绍Java 内存模型(JVM)的相关知识,感兴趣的朋友一起看看吧
    2021-09-09
  • Java数据封装树形结构代码实例

    Java数据封装树形结构代码实例

    这篇文章主要介绍了Java数据封装树形结构代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • 详解Spring boot Admin 使用eureka监控服务

    详解Spring boot Admin 使用eureka监控服务

    本篇文章主要介绍了详解Spring boot Admin 使用eureka监控服务,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-12-12
  • java简单实现复制 粘贴 剪切功能代码分享

    java简单实现复制 粘贴 剪切功能代码分享

    本文给大家分享了一段java编写的简单实现复制粘贴剪切功能的代码,需要的小伙伴可以直接拿走使用。如有更好的方案,也可以告之本人。
    2014-11-11

最新评论