2026/5/19 4:36:34
网站建设
项目流程
广西玉林网站建设正规公司,开源门户网站cms,泰安住房和城乡建设局网站,求一个好看的网站5分钟搞定Linux开机自启#xff0c;测试开机启动脚本保姆级教程
你是不是也遇到过这样的问题#xff1a;写好了一个监控脚本、日志清理程序#xff0c;或者一个简单的服务守护进程#xff0c;每次重启服务器后都要手动运行一次#xff1f;反复操作不仅费时#xff0c;还…5分钟搞定Linux开机自启测试开机启动脚本保姆级教程你是不是也遇到过这样的问题写好了一个监控脚本、日志清理程序或者一个简单的服务守护进程每次重启服务器后都要手动运行一次反复操作不仅费时还容易遗漏——尤其在生产环境里一次忘记可能就意味着服务中断。别担心Linux系统原生就支持开机自动执行脚本而且不需要额外安装任何工具。本文将带你用最直接、最稳妥的方式在5分钟内完成一个可验证、可复现、跨发行版通用的开机自启配置。全程不依赖systemd高级特性兼容CentOS 7及更早版本、Ubuntu 16.04传统SysV init模式也适用于当前仍使用/etc/init.d机制的嵌入式或轻量镜像环境——比如你正在使用的「测试开机启动脚本」镜像。我们不讲抽象概念不堆参数只做三件事写一个真正能跑起来的测试脚本让它在系统启动时自动执行验证它确实生效了现在就开始。1. 编写一个可验证的测试脚本所谓“保姆级”第一步就是确保你写的脚本本身是可靠的。我们不追求复杂功能只做一个清晰可见、结果可查的动作在系统启动时向指定文件写入一行带时间戳的日志。打开终端用root权限创建脚本sudo nano /etc/init.d/mytest.sh粘贴以下内容注意保留#!/bin/bash开头#!/bin/bash # chkconfig: 2345 99 01 # description: Simple test script for boot startup case $1 in start) echo [$(date %Y-%m-%d %H:%M:%S)] mytest.sh started at boot /var/log/mytest_boot.log ;; stop) echo [$(date %Y-%m-%d %H:%M:%S)] mytest.sh stopped /var/log/mytest_boot.log ;; restart) $0 stop $0 start ;; *) echo Usage: $0 {start|stop|restart} exit 1 ;; esac exit 0保存并退出nano中按CtrlO → Enter → CtrlX。接下来赋予执行权限sudo chmod x /etc/init.d/mytest.sh注意这个脚本不是“一写完就自动运行”的魔法它只是个待命的“演员”。下一步我们要把它正式“请上舞台”。2. 确认系统启动级别与对应rc目录Linux传统启动流程中不同运行级别runlevel会加载不同目录下的启动链接。虽然现代系统多用systemd但绝大多数主流发行版包括CentOS和Ubuntu仍完整保留SysV init兼容层而/etc/init.d//etc/rc*.d/正是其核心机制。先确认你的系统当前默认运行级别runlevel输出类似N 5或3—— 第二个数字就是目标级别5表示图形界面3表示多用户文本模式。绝大多数服务器环境为3或5如果你不确定直接查看默认目标sudo systemctl get-default 2/dev/null || echo SysV init mode (no systemd)如果返回multi-user.target或graphical.target说明底层仍通过/etc/rc3.d/或/etc/rc5.d/加载服务。结论无论输出是3还是5我们都只需操作对应的/etc/rcX.d/目录即可。小知识/etc/rcX.d/里的文件全是软链接指向/etc/init.d/中的真实脚本。以S开头表示“Start”启动以K开头表示“Kill”停止。后面的两位数字决定执行顺序比如S99mytest会在S20network之后、S98docker之前运行。3. 将脚本注册到启动序列现在进入关键一步让系统知道“这个脚本要在开机时启动”。我们不手动编辑/etc/rc.local已逐步弃用且行为不稳定也不用update-rc.dUbuntu专属CentOS不支持而是采用全发行版通用的手动软链法——简单、透明、无副作用。假设你的runlevel显示为5常见于桌面或带GUI的云镜像执行cd /etc/rc5.d/ sudo ln -sf /etc/init.d/mytest.sh S99mytest如果显示为3典型服务器环境则改为cd /etc/rc3.d/ sudo ln -sf /etc/init.d/mytest.sh S99mytestln -sf中的-f表示“强制覆盖”避免重复执行时报错S99表示“最后启动”确保它在基础网络、文件系统就绪后再运行降低依赖失败风险。验证是否成功ls -l S99mytest你应该看到类似输出S99mytest - /etc/init.d/mytest.sh这说明链接已建立系统启动时会自动调用/etc/init.d/mytest.sh start。4. 手动触发一次启动快速验证脚本逻辑别急着重启先手动运行一次确认脚本本身没有语法错误、路径权限问题或逻辑缺陷。sudo /etc/init.d/mytest.sh start然后检查日志是否写入cat /var/log/mytest_boot.log正常应输出类似[2024-06-15 10:23:45] mytest.sh started at boot如果能看到这行说明脚本可执行、路径可写、时间戳准确——万事俱备。❌ 如果报错常见原因有/var/log/目录不存在 →sudo mkdir -p /var/log权限不足 →sudo chown root:root /var/log/mytest_boot.log首次需手动创建空文件脚本语法错误 → 用bash -n /etc/init.d/mytest.sh检查语法修复后再试一次直到日志成功写入。5. 模拟重启前的最终检查清单在真正重启前请花30秒完成这几项确认避免白等几分钟检查项命令预期结果脚本存在且可执行ls -l /etc/init.d/mytest.sh权限含x如-rwxr-xr-x软链接存在且指向正确ls -l /etc/rc*.d/S99mytest显示- /etc/init.d/mytest.sh日志目录可写touch /var/log/mytest_boot.log 2/dev/null echo OK启动级别匹配runlevel | awk {print $2}输出数字与你创建软链的rcX.d一致如5→rc5.d全部通过可以放心重启了。6. 重启验证 故障排查指南执行重启命令sudo reboot等待系统重新上线后SSH重连成功立即检查日志tail -n 5 /var/log/mytest_boot.log正常情况你会看到两条记录——一条是上次手动执行的另一条是本次开机自动写入的时间戳明显新于重启时刻。❌ 如果只有旧记录说明自启未生效。按以下顺序排查排查步骤1确认软链接是否被覆盖某些发行版如Ubuntu在安装服务时会自动运行update-rc.d可能清空或重置/etc/rcX.d/。重新执行第3步的ln -sf命令再检查链接是否存在。排查步骤2检查init脚本头部注释SysV规范要求脚本顶部包含chkconfig行我们已在第1步写入# chkconfig: 2345 99 01该行告诉系统“此脚本应在运行级别2、3、4、5启动启动序号99停止序号01”。缺失此行部分系统可能忽略该脚本。排查步骤3查看系统启动日志sudo dmesg \| grep -i mytest\|init.d 2/dev/null || journalctl -b \| grep -i mytest寻找是否有mytest.sh: not found或Permission denied类报错。排查步骤4临时降级测试如果仍失败可尝试改用更通用的/etc/rc.local方式作为兜底仅限调试echo /etc/init.d/mytest.sh start | sudo tee -a /etc/rc.local sudo chmod x /etc/rc.local注意/etc/rc.local在较新systemd系统中需额外启用且优先级低于rcX.d。它仅作临时验证手段不推荐长期使用。7. 进阶建议让脚本更健壮、更实用你已经掌握了核心流程。下面这些小技巧能让你的开机脚本从“能用”升级为“好用”添加服务状态管理支持stop/restart我们在第1步脚本中已内置start/stop/restart分支。这意味着你可以随时手动控制sudo /etc/init.d/mytest.sh stop # 停止 sudo /etc/init.d/mytest.sh restart # 重启这对调试和维护至关重要。设置日志轮转避免日志撑爆磁盘新建/etc/logrotate.d/mytest/var/log/mytest_boot.log { daily missingok rotate 7 compress delaycompress notifempty }这样每天自动归档保留最近7天日志。支持systemd兼容双模保障如果你的系统同时支持SysV和systemd可额外创建一个service单元文件实现双重保障sudo tee /etc/systemd/system/mytest.service EOF [Unit] DescriptionMy Test Boot Script Afternetwork.target [Service] Typeoneshot ExecStart/etc/init.d/mytest.sh start RemainAfterExityes [Install] WantedBymulti-user.target EOF sudo systemctl daemon-reload sudo systemctl enable mytest.service这样即使未来系统升级也能平滑过渡。8. 总结你刚刚完成了什么回顾整个过程你其实只做了四件小事却构建了一套稳定可靠的自动化基础写了一个带生命周期管理的Shell脚本支持start/stop/restart输出可验证日志理解了Linux启动的本质路径/etc/init.d/是脚本存放地/etc/rcX.d/是调度入口用一条ln -sf命令完成了注册不修改系统配置不依赖包管理器零侵入通过日志实现了100%可验证的结果不是“看起来像启动了”而是“确凿写入了时间戳”。这套方法不挑发行版、不依赖新内核、不增加学习成本是运维工程师、AI镜像开发者、边缘设备部署者真正需要的“最小可行自启方案”。下次当你需要让模型加载服务、启动数据采集进程、或运行健康检查脚本时记住5分钟一个脚本一条软链一份日志——就是全部。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。