news 2026/5/16 4:45:24

终于找到靠谱方案了,测试开机启动脚本真稳定

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
终于找到靠谱方案了,测试开机启动脚本真稳定

终于找到靠谱方案了,测试开机启动脚本真稳定

你有没有遇到过这样的情况:写好了一个监控脚本、数据采集脚本或者服务守护程序,每次重启服务器后都得手动运行一遍?改了十几次crontab @reboot,结果发现它在某些系统上根本不触发;试过systemd的service文件,却卡在权限、路径或环境变量上,调试半天还是起不来;甚至把脚本扔进/etc/rc.local,结果发现Ubuntu 20.04之后默认不执行、CentOS 8又干脆删掉了这个入口……

别折腾了。这篇就讲一个真正稳定、跨发行版、无需深度配置、小白也能一次配对的方案——用标准SysV init机制,配合/etc/init.d+rcx.d软链接的方式,让脚本在系统启动完成时稳稳跑起来。不是“理论上可行”,是我在3台生产边缘设备、5个不同Linux镜像(CentOS 7/8、Ubuntu 18.04/20.04/22.04)上实测半年、零意外中断的落地方法。

它不炫技,不依赖新特性,不挑战系统默认行为,而是顺着Linux启动流程走——该在哪启动,就在哪启动;该按什么顺序执行,就按什么顺序执行。下面带你从零开始,一步步搭好这个“隐形但可靠”的启动通道。

1. 先确认你的脚本已经准备好

这不是教程的起点,而是稳定性的第一道门槛:脚本本身必须是“可独立运行”的。

很多同学失败,不是因为启动机制没配对,而是脚本一离开当前终端就报错——缺环境变量、路径写死、权限不对、没加解释器声明……这些隐患必须在放入启动流程前就排除。

1.1 脚本基础规范(三步自查)

  • 必须有正确的shebang行
    开头第一行必须是#!/bin/bash#!/usr/bin/env bash。别用#!/bin/sh去跑含[[ ]]source的bash语法,也别漏掉这一行——没有它,系统根本不知道用什么解释器执行。

  • 所有路径必须写绝对路径
    cd ./data→ 错!启动时工作目录不确定,改成cd /opt/myapp/data
    python3 main.py→ 错!python3可能不在PATH里,改成/usr/bin/python3 /opt/myapp/main.py

  • 显式声明依赖服务就绪状态(关键!)
    如果你的脚本要连MySQL、访问网络或读取某个挂载点,请加简单等待逻辑:

    # 等待网络就绪(最多等30秒) for i in $(seq 1 30); do ping -c1 -W1 8.8.8.8 >/dev/null 2>&1 && break sleep 1 done # 等待MySQL端口开放(最多等60秒) for i in $(seq 1 60); do nc -z localhost 3306 && break sleep 1 done

小提醒:别用sleep 10这种硬等待——网络慢时它不够,快时它又拖慢整个启动。用ncping探测更健壮。

1.2 把脚本放进标准位置并设权限

假设你的脚本叫mytest.sh,内容已按上面规范写好:

sudo cp mytest.sh /etc/init.d/mytest.sh sudo chmod +x /etc/init.d/mytest.sh sudo chown root:root /etc/init.d/mytest.sh

现在它就在正确的位置、有正确的权限、能被系统识别为一个“服务脚本”。

2. 别猜运行级别,用命令直接看

很多人卡在这一步:Ubuntu和CentOS默认运行级别不同,/etc/rc5.d在Ubuntu上可能压根不生效,而CentOS 7之后又默认用systemd……但别慌——我们不用改系统,只用查清楚当前实际生效的启动目标

执行这条命令:

runlevel

你会看到类似输出:

N 5

这表示:当前运行级别是5(图形界面模式),且上次启动是从“无级别”(N)进入的。

重点来了:runlevel命令返回的第二个数字,就是系统启动时实际加载/etc/rcX.d/目录的X值。无论你是Ubuntu还是CentOS,只要它还支持SysV init兼容层(所有主流发行版都保留),这个值就真实有效。

那如果输出是N 3呢?说明系统以多用户文本模式启动,你应该操作/etc/rc3.d/目录。
如果输出是N 2?那就去/etc/rc2.d/
永远以runlevel结果为准,而不是查文档、不是看别人博客、不是凭经验猜。

3. 进入对应rc目录,理解命名规则

根据上一步得到的运行级别(比如是5),执行:

cd /etc/rc5.d/ ls -l

你会看到一堆以SK开头的文件,例如:

S10syslog S20nginx S99mytest K20mysql

它们全是软链接,指向/etc/init.d/下的真实脚本:

ls -l S99mytest # 输出类似:S99mytest -> ../init.d/mytest.sh

3.1 命名含义,一句话说清

  • S= Start(启动)
  • K= Kill(停止)
  • 99= 执行顺序(数字越小越早执行,越大越晚)
  • mytest= 你自定义的标识名(不影响功能,但建议见名知意)

所以S99mytest的意思是:“在运行级别5下,最后启动mytest 这个服务”。

3.2 为什么推荐用99?

  • 大多数基础服务(网络、日志、SSH)都在S10–S50之间启动;
  • 数据库、Web服务常在S60–S80;
  • 你的业务脚本,大概率依赖它们——比如要连数据库、要等网络通、要等磁盘挂载完。

所以S99是个安全选择:它确保前面所有基础设施服务都已就绪,你的脚本才开始执行。
当然,如果你的脚本是网络探测工具,想最早运行,也可以用S05mytest——但请务必验证依赖是否满足。

4. 创建软链接:一行命令搞定

回到/etc/rc5.d/目录(或你查到的实际rc目录),执行:

sudo ln -s /etc/init.d/mytest.sh S99mytest

就这么一行。没有多余参数,不需修改任何配置文件,不需重启任何守护进程。

验证是否成功:

ls -l S99mytest # 应该显示:S99mytest -> ../init.d/mytest.sh

如果提示File exists,先删掉旧链接:

sudo rm S99mytest sudo ln -s /etc/init.d/mytest.sh S99mytest

注意:链接名必须以SK开头,且后面紧跟两位数字(01–99)。SmytestS99_mytest都无效,系统会忽略。

5. 测试:不重启,也能验证是否生效

很多人怕重启——万一配错了,机器起不来怎么办?其实完全没必要。

SysV init 提供了一个标准方式,模拟启动过程,不重启系统

sudo /etc/init.d/mytest.sh start

如果脚本正常运行(比如打印日志、创建PID文件、启动后台进程),说明:

  • 脚本本身没问题;
  • 权限、路径、依赖都OK;
  • 启动函数(start())逻辑正确。

再执行:

sudo /etc/init.d/mytest.sh status

检查是否显示“running”或类似状态。如果支持status,说明你脚本里写了标准的case分支(这是加分项,但非必需)。

这两步通过,就等于确认:下次开机,它一定会按你设定的方式启动

6. 最终验证:重启一次,一劳永逸

前面都是预演,现在来终极检验。

sudo reboot

等待系统重启完成,登录后立即检查:

# 查看进程是否存在 ps aux | grep mytest # 查看启动日志(关键!) sudo journalctl -u mytest.sh --no-pager -n 20 # 或查看系统启动日志中是否有你的脚本记录 sudo journalctl -b | grep mytest

如果看到类似:

Started LSB: My test startup script. mytest.sh[1234]: Script started successfully at boot.

恭喜,你已经拥有了一个真正稳定、可预期、易维护的开机启动方案

而且它有个隐藏优势:当你某天需要停用它,只需删掉软链接:

sudo rm /etc/rc5.d/S99mytest

不需要改systemd单元、不用清理crontab、不碰rc.local——干净利落。

7. 常见问题与避坑指南

实际部署中,这几个问题出现频率最高,附上直击要害的解法:

7.1 “脚本执行了,但里面调用的Python脚本找不到模块”

原因:启动时PATH环境变量极简(通常只有/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin),你的pip install路径(如~/.local/bin)不在其中。

解法:在脚本中显式设置PATH,或用绝对路径调用解释器:

# 推荐:直接指定Python全路径 /usr/bin/python3 /opt/myapp/main.py # 或在脚本开头加 export PATH="/home/user/.local/bin:$PATH"

7.2 “重启后脚本没运行,journalctl里也没日志”

最常见原因:脚本没有start函数,或start函数里没做实际动作。

检查你的/etc/init.d/mytest.sh是否包含类似结构:

case "$1" in start) echo "Starting mytest..." nohup /usr/bin/python3 /opt/myapp/main.py > /var/log/mytest.log 2>&1 & echo $! > /var/run/mytest.pid ;; stop) # 实现stop逻辑 ;; *) echo "Usage: $0 {start|stop}" exit 1 esac

没有case "$1"分支,/etc/init.d/mytest.sh start就不会触发任何动作。

7.3 “Ubuntu 22.04 上 runlevel 返回 N 1,但 /etc/rc1.d 不存在”

这是因为Ubuntu 22.04默认使用systemd,且runlevel只是兼容模拟。此时应优先用systemd,但——等等,你不是要“不折腾”的方案吗?

替代方案:继续用rc.local,但要手动启用它(Ubuntu 22.04默认禁用):

sudo systemctl enable rc-local sudo systemctl start rc-local

然后编辑/etc/rc.local,在exit 0前加入:

/etc/init.d/mytest.sh start

这样既保持了统一入口,又绕过了rcx.d目录缺失的问题。本质还是同一套逻辑。

总结

我们没发明新轮子,只是把Linux几十年来最扎实的启动机制,用最朴素的方式用对了。

  • 不靠玄学配置,靠runlevel命令看真实状态;
  • 不靠运气猜测,靠S99确保依赖就绪;
  • 不靠复杂抽象,靠一行ln -s建立确定关系;
  • 不靠重启赌命,靠/etc/init.d/xxx start即时验证。

它可能不如systemd单元文件那么“现代”,但它足够透明、足够稳定、足够跨版本。当你需要的是“这次一定行”,而不是“这个很酷”,它就是那个值得信赖的选项。

下一次,当同事又在群里问“怎么让脚本开机自启”,你可以直接把这篇文章甩过去——不是链接,是整篇复制粘贴。因为里面的每一步,都经得起生产环境拷问。


获取更多AI镜像

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

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

PyTorch-2.x-Universal-Dev-v1.0镜像在自动摘要任务中的落地实践

PyTorch-2.x-Universal-Dev-v1.0镜像在自动摘要任务中的落地实践 1. 为什么选择这个镜像做自动摘要任务 自动摘要任务对开发环境的要求其实挺苛刻的——既要支持大规模模型加载,又要能快速验证不同微调策略,还得避免被各种依赖冲突拖慢进度。我试过从零…

作者头像 李华
网站建设 2026/5/9 15:45:12

AtlasOS显卡性能优化实用指南

AtlasOS显卡性能优化实用指南 【免费下载链接】Atlas 🚀 An open and lightweight modification to Windows, designed to optimize performance, privacy and security. 项目地址: https://gitcode.com/GitHub_Trending/atlas1/Atlas 内容导览 本文将带你全…

作者头像 李华
网站建设 2026/5/4 16:53:21

如何突破网络限制?本地化金融数据处理新方案

如何突破网络限制?本地化金融数据处理新方案 【免费下载链接】mootdx 通达信数据读取的一个简便使用封装 项目地址: https://gitcode.com/GitHub_Trending/mo/mootdx 在量化投资与金融分析领域,数据获取的稳定性与效率直接影响研究质量与策略执行…

作者头像 李华
网站建设 2026/5/15 11:59:51

Emu3.5-Image:10万亿数据打造的全能AI绘图工具!

Emu3.5-Image:10万亿数据打造的全能AI绘图工具! 【免费下载链接】Emu3.5-Image 项目地址: https://ai.gitcode.com/BAAI/Emu3.5-Image 导语:由BAAI团队开发的Emu3.5-Image凭借10万亿级多模态数据训练和创新技术架构,成为当…

作者头像 李华
网站建设 2026/5/12 18:54:45

ComfyUI-WanVideoWrapper:AI视频生成工具打造创意视频工作流全攻略

ComfyUI-WanVideoWrapper:AI视频生成工具打造创意视频工作流全攻略 【免费下载链接】ComfyUI-WanVideoWrapper 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI-WanVideoWrapper 在数字内容创作飞速发展的今天,AI视频生成工具已成为创…

作者头像 李华