Linux中Java应用程序的开机自启方案
一、前言
在五一假期要开始的时候,因为服务器区域供电单位要作业,机房没有足够的UPS,导致服务器要长时间的停电停机。但是业务在假期要使用系统,IT无法提供远程账号,所以只能等来电开启系统,维护服务了。所以计划选择一个方案实现Linux中的Java应用程序实现开机自启动方案。在Windows系统中,一般我们可以通过将应用程序设置为系统服务,然后属性->启动类型设置为自启动方式,服务主机关机后在开机会自动启动设置的系统服务。那么在Linux环境(Centos)下如何实现应用程序的开机自启动?保证不用人为的操作启动应用程序?
二、Systemd模块
要实现例如Windows的系统服务,先来认识systemd,是Linux系统的一套基本构建模块。它提供了一个系统和服务管理器,作为PID 1运行并启动系统的其余部分,提供积极的并行化功能,使用套接字和D-Bus激活来启动服务,提供按需启动守护进程,使用Linux控制组跟踪进程,维护挂载和自动挂载点,并实现一个精心设计的基于事务依赖的服务控制逻辑,其主要内容如下图所示:
主要实现的目的是改进表示依赖关系的软件框架,允许在系统引导期间并发或并行地完成更多的处理,并减少shell的计算开销,以取代Linux传统的System V init,与init对比的特征表现如下几点:
①与init守护进程一样,systemd是一个管理其他守护进程的守护进程,这些守护进程(包括systemd本身)都是后台进程
②systemd是在引导期间启动的第一个守护进程,也是在关闭期间终止的最后一个守护进程。
③systemd守护进程作为用户空间进程树的根; 第一个进程(PID 1)在Unix系统上具有特殊的作用,因为当原始父进程终止时,它将替换父进程。
注意:通过上述概念systemd可以使用于守护进程,并且提供按需启动的的守护进程,我们的Java应用程序使用systemed来实现开机自启动的方案。
三、设置服务
第一步、创建服务文件,相当于Window中创建一个服务,在根目录etc/systemd/system文件夹下,创建一个以.service后缀的服务文件gs-mes-app,如下所示(默认文件包含多个已知的服务文件)。
第二步、在文件中编写服务内容,以启动Java应用程序为例,主要的参数项内容如下:
[Unit] # 应用描述 Description=XXXX系统 After=network.target [Service] # 工作目录 WorkingDirectory=/home/mes/ User=root # 运行jar包的指令 ExecStart=/usr/java/jdk1.8.0_281-amd64/bin/java -jar -Xmx1536m /home/mes/mes-admin.jar # 收到正常停止命令时不自动重启(systemctl stop 时不会自动重启) SuccessExitStatus=143 # 在服务失败时自动重启 Restart=always # 重启前等待10秒 RestartSec=10 # 重启尝试间隔时间 StartLimitInterval=10 # 间隔时间内的最大重启尝试次数 StartLimitBurst=3 [Install] WantedBy=multi-user.target
其中ExecStart,/usr/java/jdk1.8.0_281-amd64/bin/java是在Linux环境按照的JDK的目录,/home/mes/mes-admin.jar是运行Java应用程序的JAR包路径,其它参数包括重启等待时长,重启尝试间隔时间,重启尝试次数等。
第三步、在命令中刷新存放在system文件夹下服务文件,必须在etc/systemd/system中,否则无法加载文件。
sudo systemctl daemon-reload
第四步、在命令中启用服务,并且使用在开机自启动,其中enable状态表示开机自启动,disenable表示开机不启动,static表示对应Unit文件中没有定义[Install]区域,因此无法设置开机自启动。
sudo systemctl enable xxxx.service
第五步、启动服务,则完成systemctl指令管理你的java应用。
# 启动 sudo systemctl start XXX.service # 停止 sudo systemctl stop XXX.service # 查看状态 sudo systemctl status XXX.service
在命令中可以通过如下命令查看相关systemd的内容
#启动一个服务 systemctl start postfix.service #关闭一个服务 systemctl stop postfix.service #重启一个服务 systemctl restart postfix.service #显示一个服务的状态 systemctl status postfix.service #在开机时启用一个服务 systemctl enable postfix.service #在开机时禁用一个服务 systemctl disable postfix.service #查看服务是否开机启动 systemctl is-enabled postfix.service #查看已启动的服务列表 systemctl list-unit-files|grep enabled #查看启动失败的服务列表 systemctl --failed #重新加载service文件 systemctl daemon-reload
四、总结
通过上述方式比较好解决了服务应为意外终止,开机自启动减少人工的维护,当然,这个只是其中的一个解决方案,还可以通过Cron定时任务,或者借助第三方软件比如容器来启动相关服务,解决这个问题。
参考:https://blog.51cto.com/littledevil/1912570、https://www.jianshu.com/p/d35c23404175、https://blog.csdn.net/weixin_44003789/article/details/136298183
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?