news 2026/4/26 17:17:14

测试开机启动脚本镜像使用分享:真实部署全过程记录

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
测试开机启动脚本镜像使用分享:真实部署全过程记录

测试开机启动脚本镜像使用分享:真实部署全过程记录

1. 引言

在实际的服务器运维和自动化部署场景中,确保服务在系统重启后能够自动恢复运行是保障系统高可用性的关键环节。尤其是在云环境或边缘设备上,手动干预成本高、响应慢,因此开机自启动脚本成为不可或缺的一环。

本文基于“测试开机启动脚本”这一CSDN星图镜像的实际使用经验,完整记录从镜像拉取到服务配置、脚本编写、权限设置再到最终验证自启动功能的全流程。文章聚焦于Ubuntu系统下的实践操作,适用于需要部署Java微服务或其他后台进程的工程团队。

通过本文,你将掌握:

  • 如何正确编写符合init规范的启动脚本
  • 如何将其注册为系统服务并实现开机自启
  • 常见问题排查与权限处理技巧
  • 镜像化部署中的最佳实践建议

2. 环境准备与镜像初始化

2.1 镜像基本信息确认

本次使用的镜像是CSDN星图平台提供的“测试开机启动脚本”镜像,其核心用途为预置一个可快速启动的服务框架,便于用户在此基础上定制自己的启动逻辑。

该镜像基于Ubuntu 20.04 LTS构建,已预装以下基础组件:

  • bash/shell环境
  • systemd及sysv-rc-conf工具集
  • 基础开发工具(如ps、awk、grep等)

注意:该镜像本身不包含具体业务服务,仅提供脚本模板和执行环境,需用户自行注入服务程序(如JAR包、Python应用等)。

2.2 启动实例并进入系统

通过CSDN星图平台选择该镜像创建实例后,使用SSH登录目标主机:

ssh ubuntu@<instance-ip>

登录成功后,首先检查系统版本和服务管理器类型:

lsb_release -a ps --no-headers -o comm 1

输出应显示:

Distributor ID: Ubuntu Description: Ubuntu 20.04 LTS ... systemd

这表明系统使用systemd作为主进程管理器,但仍兼容传统的SysVinit脚本方式,为我们后续注册服务提供了灵活性。


3. 编写标准化启动脚本

3.1 脚本结构设计原则

Linux系统对开机启动脚本有明确的元数据要求,尤其是通过update-rc.d注册时,必须包含LSB(Linux Standard Base)头部信息,否则可能导致服务无法识别或依赖关系错误。

我们以启动多个Java服务为例,编写统一控制脚本/etc/init.d/test

3.2 完整启动脚本示例

#!/bin/bash ### BEGIN INIT INFO # Provides: test # Required-Start: $local_fs $network # Required-Stop: $local_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start and stop test services # Description: Manages multiple backend services including file, opt, merchant ### END INIT INFO # 服务目录配置 deploy_dir="/home/ubuntu/deploy" services=("file" "opt" "merchant") # 日志输出路径(可选) log_file="/var/log/test-service.log" start() { echo "$(date): Starting test services..." >> "$log_file" for svc in "${services[@]}"; do svc_path="$deploy_dir/$svc" if [ -d "$svc_path" ]; then cd "$svc_path" || continue if [ -f "start.sh" ]; then echo "Starting service: $svc" sh start.sh else echo "Warning: start.sh not found in $svc_path" fi else echo "Service directory missing: $svc_path" fi done } stop() { echo "$(date): Stopping test services..." >> "$log_file" for svc in "${services[@]}"; do svc_path="$deploy_dir/$svc" if [ -d "$svc_path" ] && [ -f "$svc_path/stop.sh" ]; then cd "$svc_path" || continue echo "Stopping service: $svc" sh stop.sh fi done } restart() { stop sleep 2 start } case "$1" in start) start ;; stop) stop ;; restart) restart ;; *) echo "Usage: $0 {start|stop|restart}" exit 1 ;; esac exit 0

3.3 关键点说明

要素说明
LSB Header必须包含Provides,Required-Start,Default-Start等字段,用于依赖解析
Default-Start 2 3 4 5表示在多用户文本模式(2-5)下启动,不包括单用户模式(1)和关机(0,6)
$local_fs $network依赖本地文件系统和网络就绪后再启动服务
日志记录添加时间戳日志有助于故障排查

4. 配置服务并注册开机自启

4.1 脚本权限设置

将脚本复制到/etc/init.d/目录,并赋予可执行权限:

sudo cp test /etc/init.d/ sudo chmod +x /etc/init.d/test

验证权限是否生效:

ls -l /etc/init.d/test

输出应包含rwxr-xr-x权限位。

4.2 使用 update-rc.d 注册服务

执行命令将服务加入开机启动队列:

sudo update-rc.d test defaults 95

参数解释:

  • defaults:使用默认运行级别(2-5启动,0,1,6停止)
  • 95:S95表示启动优先级,数字越大越晚启动;建议关键服务设为80-95之间

查看生成的符号链接:

ls /etc/rc*.d | grep test

预期输出类似:

/etc/rc0.d/K05test /etc/rc1.d/K05test /etc/rc2.d/S95test ...

其中S95表示运行级2下以优先级95启动。

4.3 验证服务状态与手动测试

尝试手动启动服务:

sudo service test start

或等价命令:

sudo /etc/init.d/test start

检查日志/var/log/test-service.log是否有启动记录。

若需查看服务状态,可临时添加status分支到脚本中,例如:

status() { jps | grep jar }

5. 多服务启动脚本详解

5.1 单个服务启动脚本(以file服务为例)

文件路径:/home/ubuntu/deploy/file/start.sh

#!/bin/sh echo "Starting file server..." echo "Please wait..." # 先清理旧进程 ps -ef | grep 'file.jar' | grep -v grep | awk '{print $2}' | while read pid; do kill -9 "$pid" 2>/dev/null || true done # 删除旧日志 rm -f log.out gc.log oom.dump # 启动新服务 nohup java \ -server \ -XX:+UseG1GC \ -XX:+PrintGCDetails \ -XX:+PrintHeapAtGC \ -Xloggc:./gc.log \ -XX:+HeapDumpOnOutOfMemoryError \ -XX:HeapDumpPath=./oom.dump \ -jar file.jar > log.out 2>&1 & echo "File server started with PID $!"

5.2 停止脚本示例

文件路径:/home/ubuntu/deploy/file/stop.sh

#!/bin/sh echo "Stopping file server..." ps -ef | grep 'file.jar' | grep -v grep | awk '{print $2}' | while read pid; do echo "Killing process $pid" kill -9 "$pid" done rm -f log.out

5.3 权限与可执行性注意事项

所有.sh脚本必须具有执行权限:

chmod +x start.sh stop.sh

同时建议在脚本首行指定解释器(#!/bin/sh),避免因环境差异导致执行失败。


6. 常见问题与解决方案

6.1 服务未随系统启动

现象:重启后服务未运行
排查步骤

  1. 检查/etc/rc*.d中是否存在S开头的链接
  2. 查看系统日志:sudo journalctl -b | grep test
  3. 确认脚本是否有语法错误:sudo /etc/init.d/test start手动执行是否报错

典型原因

  • 脚本缺少LSB头
  • 路径中使用了相对路径或环境变量未加载
  • 权限不足导致无法访问JAR文件或日志目录

6.2 Java进程无法杀死

现象kill -9无效或残留进程
解决方法

  • 使用更精确的匹配条件,避免误杀其他Java进程:
    ps -ef | grep '[f]ile.jar' | awk '{print $2}'
  • 检查是否以root身份运行而当前用户无权终止

6.3 日志输出混乱或缺失

建议做法

  • 所有后台服务重定向标准输出和错误流:> log.out 2>&1 &
  • 使用nohup防止终端关闭中断进程
  • 设置日志轮转策略(可结合logrotate)

7. 总结

7. 总结

本文围绕“测试开机启动脚本”镜像的实际使用,系统性地完成了从环境初始化、脚本编写、服务注册到最终验证的全链路部署流程。核心要点总结如下:

  1. 脚本规范性至关重要:必须包含LSB元数据头,才能被update-rc.d正确识别并建立依赖关系。
  2. 权限管理不可忽视:所有脚本需具备可执行权限,且运行上下文要能访问所需资源路径。
  3. 日志机制提升可观测性:添加时间戳日志记录,便于排查启动失败问题。
  4. 兼容systemd与SysVinit双模式:虽然现代Ubuntu使用systemd,但保留SysVinit脚本能简化迁移过程。
  5. 自动化测试必不可少:每次修改后应通过reboot真实验证自启动效果。

此外,该镜像的价值在于提供了一个可复用的自动化起点,开发者只需替换deploy目录下的服务内容和脚本逻辑,即可快速构建专属的自启动解决方案。

对于希望进一步提升稳定性的团队,建议在此基础上引入:

  • 进程守护工具(如supervisor)
  • 健康检查接口与心跳监控
  • 自动恢复机制(配合cron或systemd timer)

获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/26 17:17:07

EDSR模型部署实战:画质提升与GPU算力需求

EDSR模型部署实战&#xff1a;画质提升与GPU算力需求 1. 引言 1.1 AI 超清画质增强技术背景 随着数字图像在社交媒体、安防监控和文化遗产修复等领域的广泛应用&#xff0c;低分辨率图像带来的信息缺失问题日益突出。传统双线性或双三次插值算法虽然计算效率高&#xff0c;但…

作者头像 李华
网站建设 2026/4/26 17:14:55

新手教程:如何在C#项目中集成nmodbus4类库使用教程

打开工业通信之门&#xff1a;手把手教你用 C# 轻松玩转 nmodbus4你有没有遇到过这样的场景&#xff1f;公司新上了一套温控系统&#xff0c;PLC 上的数据要实时显示在电脑屏幕上&#xff1b;或者项目里需要读取电表的电量信息&#xff0c;但设备只支持 Modbus 协议……这时候&…

作者头像 李华
网站建设 2026/4/24 23:47:09

串口DMA在PLC通信中的实际应用:项目解析

串口DMA在PLC通信中的实战落地&#xff1a;从原理到工程优化工业现场的通信总线&#xff0c;就像一条永不停歇的流水线——数据帧源源不断地来&#xff0c;也必须稳稳当当地走。可一旦这条线上跑的是几十个Modbus从站、每10毫秒就要轮询一遍&#xff0c;传统的中断式串口处理方…

作者头像 李华
网站建设 2026/4/25 0:24:19

Vetur错误诊断机制核心要点解析

Vetur 是如何在你敲代码时揪出那些“隐形 Bug”的&#xff1f;你有没有过这样的经历&#xff1a;写完一段 Vue 模板&#xff0c;保存刷新却发现页面空白&#xff1f;打开控制台一看&#xff0c;原来是v-for里拼错了变量名。更糟的是&#xff0c;这种错误只有运行起来才暴露——…

作者头像 李华
网站建设 2026/4/24 9:29:10

高效开源的SAM3分割镜像发布|支持英文Prompt精准提取掩码

高效开源的SAM3分割镜像发布&#xff5c;支持英文Prompt精准提取掩码 1. 技术背景与核心价值 近年来&#xff0c;图像分割技术在计算机视觉领域取得了显著进展。传统的实例分割方法依赖于大量标注数据和固定类别体系&#xff0c;难以应对开放世界中“万物皆可分”的实际需求。…

作者头像 李华
网站建设 2026/4/24 13:49:45

MinerU显存溢出怎么办?CPU模式切换步骤详解

MinerU显存溢出怎么办&#xff1f;CPU模式切换步骤详解 1. 问题背景与场景说明 在使用 MinerU 2.5-1.2B 模型进行复杂 PDF 文档解析时&#xff0c;用户可能会遇到**显存溢出&#xff08;Out of Memory, OOM&#xff09;**的问题。该模型基于视觉多模态架构&#xff0c;具备强…

作者头像 李华