如何将java -jar启动的服务设置为systemd服务管理方式
要将一个使用 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]
部分:
User
和Group
: 如果希望服务以非root
用户和用户组运行,指定相应的用户名和用户组名。Restart
和RestartSec
: 设置当服务崩溃时自动重启策略,这里是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应用程序,无需加上 nohup
。systemd
会负责管理这个进程的生命周期,确保它在后台运行,不受终端会话影响,并在服务停止时正确清理资源。
因此,当您按照上述步骤将Java应用程序配置为 systemd
服务后,就不需要再使用 nohup
命令来保持其后台运行。systemd
提供的稳定性和可靠性足以满足大多数生产环境的需求。
如果您在Jenkins Pipeline中需要启动这个服务,可以直接调用 systemctl start myapp.service
,而不是使用 nohup java -jar ... &
。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
相关文章
Spring注解驱动之BeanFactoryPostProcessor原理解析
这篇文章主要介绍了Spring注解驱动之BeanFactoryPostProcessor原理,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-09-09Spring Boot整合MybatisPlus逆向工程(MySQL/PostgreSQL)
MyBatis-Plus是MyBatis的增强工具,本文主要介绍了Spring Boot整合MybatisPlus逆向工程(MySQL/PostgreSQL),具有一定的参考价值,感兴趣的可以了解一下2021-07-07详解Spring boot Admin 使用eureka监控服务
本篇文章主要介绍了详解Spring boot Admin 使用eureka监控服务,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧2017-12-12
最新评论