当前位置: 首页 > news >正文

centos systemd 方式设置java开机自启、系统服务

前言

工作中,经常见到需要将java设置为开机自启,通常的思路是将java设置为服务,然后纳入systemd管理,然后开启开机自启;以下是实现步骤

编写java服务脚本

/etc/systemd/system下新建my_java.service,内容

[Unit] Description=My Java Application Service After=network.target [Service] #当服务崩溃时自动重启 Restart=on-failure #重启前等待10秒 RestartSec=10s ExecStart=/opt/my_java/my_java.sh start ExecStop=/opt/my_java/my_java.sh stop [Install] WantedBy=multi-user.target

为了便于维护,通常将启动命令单独保存为脚本文件,my_java.sh内容

#!/bin/sh PNAME='my_java' # 只有root用户才能执行 if [ $(id -u) != "0" ]; then echo "Error: You must be root to run this script"; exit 1; fi # 有新jar则先移动到目标目录,实际,通常是上传到用户主目录下,然后执行脚本就行了 if [ -f /home/my_user/${PNAME}*.jar ]; then mv /home/my_user/${PNAME}*.jar /opt/my_java; fi # 找到运行中的java进程id # ps aux 命令可能被截断,ps auxww会展示全部 PID=`ps auxww | grep /usr/local/jdk1.8.0_301/bin/java | grep ${PNAME} | awk '{print $2}'` # 将jar所在路径按照时间排序 JAR=`ls -lt /opt/my_java/${PNAME}*.jar | head -1 | awk '{print $NF}'` case "${1}" in 'start') if [ -n "${PID}" ]; then echo "${0}: ${PNAME} is already running: ${PID}" exit 0 fi # 注意,受限于systemd不能读取环境变量,所以脚本中的java命令要改为全路径 # 因为service默认是simple类型,不能以nohup方式启动 /usr/local/jdk1.8.0_301/bin/java -jar ${JAR} --spring.profiles.active=myProfile 2>&1 1>/dev/null ;; 'stop') if [ -n "${PID}" ]; then kill -9 $PID; fi ;; 'restart') if [ -n "${PID}" ]; then kill -9 $PID; fi echo "/usr/local/jdk1.8.0_301/bin/java -jar ${JAR} --spring.profiles.active=myProfile 2>&1 1>/dev/null"| at now ;; 'status') if [ -n "${PID}" ]; then echo "${0}: ${PNAME} is ONLINE=${PID}, current jar is ${JAR}" exit 0 else echo "${0}: ${PNAME} is OFFLINE, current jar is ${JAR}" exit 0 fi ;; *) echo "Usage: ${0} { start | stop | status }" exit 1 ;; esac exit 0

因为service默认类型是simple,所以不能以nohup方式启动java,可参考linux systemd Failed at step EXEC spawning /some/path/my_sh.sh: Permission denied

设置开机自启/禁用

设置开机自启

systemctl enable my_java

禁用开机自启

systemctl disable my_java

查看服务状态

systemctl status my_java

如果启动失败,查看日志

journalctl -u my_java
http://www.cnnetsun.cn/news/1947012.html

相关文章:

  • 用QT给MFRC522做个管理工具:从读卡号到读写扇区的完整桌面应用开发实录
  • 终极指南:3分钟掌握Mem Reduct内存优化工具,让你的Windows电脑重获新生
  • Confluent Schema Registry高可用架构:集群部署与负载均衡
  • League Akari:基于LCU API的现代Electron英雄联盟客户端工具箱完整指南
  • ICC2/Innovus实战:多策略融合优化reg2icg时序违例的深度解析
  • 题解:洛谷 P1966 [NOIP 2013 提高组] 火柴排队
  • Python驱动CANoe自动化测试:从COM接口调用到Type Library解析的实战指南
  • 题解:洛谷 AT_abc424_a [ABC424A] Isosceles
  • 汽车ESP系统仿真建模及基于Carsim与Simulink联合仿真的单侧双轮制动控制方法解析
  • TSM视频理解模型实战:从数据采样到自定义任务部署
  • SocialEcho社区管理实战:如何创建和管理兴趣社区
  • 如何在.NET项目中快速集成网易云音乐API:终极C音乐接口解决方案
  • Smart Connections 架构演化:从插件到智能生态系统的设计哲学
  • IndraDB高级查询技巧:多跳遍历与属性索引的实战应用
  • 大麦网自动抢票脚本:如何用5行代码实现90%抢票成功率?
  • 【稀缺】LLM时代首份《代码训练数据可信度评估白皮书》(含12维量化打分矩阵+GitHub真实项目验证)
  • SITS2026 AI前端生成器性能压测全公开(TPS 42.8,错误注入恢复时间<800ms):附5类边界Case及防御性封装模板
  • AI代码迁移生死线:2026奇点大会技术委员会紧急预警(92.7%企业因忽略这4个语义锚点导致LLM生成代码崩溃)
  • 从‘成绩评级’到‘订单状态机’:用C# switch case玩转真实业务逻辑(附Razor页面示例)
  • OpenCV Sobel算子:从数学原理到边缘检测实战
  • QChart交互实战:从零封装支持框选、滚轮、右键拖拽与数据感知的通用视图控件
  • Security+ 学习笔记2:恶意软件的攻防实战与深度剖析
  • 你的A/B测试结果真的可信吗?用Python的SciPy库做个卡方检验验证一下
  • 5个最适合初学者的语义分割数据集推荐(附下载链接与使用教程)
  • 2026年高校AI率标准汇总:本科30%硕士15%博士10%怎么达标
  • FanControl终极指南:5步掌握Windows风扇智能控制,告别噪音与高温烦恼
  • 5分钟掌握Steam成就管理器:解锁你的游戏成就自由
  • Source Insight在Linux下的平替方案探索:除了Wine,我们还有哪些选择?
  • 3个2D寻路突破:用NavMeshPlus重构Unity智能导航体系
  • 从R-CNN到YOLO:揭秘实时目标检测的统一架构革命