news 2026/6/24 8:56:08

从0开始学rc.local配置,测试脚本手把手教学

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从0开始学rc.local配置,测试脚本手把手教学

从0开始学rc.local配置,测试脚本手把手教学

1. 引言:为什么需要开机自启动脚本

在嵌入式设备、服务器和自动化系统中,开机自动执行特定任务是一项基础且关键的需求。无论是启动服务、初始化硬件,还是运行监控脚本,我们都希望系统在完成引导后能自动完成这些操作,而无需人工干预。

rc.local是 Linux 系统中最经典、最直观的自启动机制之一。尽管现代发行版逐渐转向systemd,但rc.local仍因其简单易懂、兼容性强,被广泛用于快速实现开机脚本功能。

本文将带你:

  • ✅ 理解rc.local的工作原理
  • ✅ 在 Ubuntu 和树莓派环境中配置开机脚本
  • ✅ 避免常见陷阱(如卡死启动界面)
  • ✅ 手把手完成一个可验证的测试脚本

无论你是初学者还是需要快速落地的开发者,都能通过本文掌握rc.local的完整使用流程。

2. rc.local 的核心机制解析

2.1 什么是 rc.local?

rc.local是一个传统的 Linux 启动脚本,位于/etc/rc.local。它由系统的初始化系统(init 或 systemd)在多用户模式启动完成后调用,用于执行用户自定义命令。

其核心特点包括:

  • 执行时机晚:在所有系统服务(如网络、文件系统)启动之后运行
  • 以 root 权限执行:适合需要高权限的操作
  • 顺序执行:脚本中的命令按顺序阻塞执行,除非显式后台运行
  • 兼容性好:几乎所有 Linux 发行版都曾支持该机制

2.2 工作流程与执行顺序

Linux 系统启动过程中,rc.local的调用流程如下:

BIOS → Bootloader → Kernel → init/systemd → 系统服务启动 → rc.local → 登录提示

这意味着:

  • 你可以安全地访问网络、挂载点、USB 设备等资源
  • 若脚本长时间阻塞,会导致系统“卡”在启动界面
  • 推荐将耗时任务放入后台运行(使用&

2.3 与 systemd 的关系

自 Ubuntu 16.04 起,rc.local不再默认启用,而是由systemd通过rc-local.service来管理。因此,要使用rc.local,必须确保以下条件满足:

  1. /etc/rc.local文件存在且可执行
  2. rc-local.service已正确配置并启用
  3. 服务单元文件包含[Install]段以支持开机启动

3. Ubuntu 环境下配置 rc.local 开机脚本

3.1 环境准备

本文基于Ubuntu 18.04 LTS(虚拟机环境),其他版本步骤类似。

确认系统是否已安装rc-local.service

ls /lib/systemd/system/ | grep rc-local

正常应输出:

rc-local.service

若无输出,则需手动创建或检查系统版本。

3.2 配置 rc-local.service

默认的rc-local.service可能缺少[Install]段,导致无法启用。需手动编辑:

sudo chmod 644 /lib/systemd/system/rc-local.service sudo vim /lib/systemd/system/rc-local.service

在文件末尾添加以下内容:

[Install] WantedBy=multi-user.target Alias=rc-local.service

注意WantedBy=multi-user.target表示该服务在多用户文本模式下启动,是标准配置。

3.3 创建并配置 /etc/rc.local

创建脚本文件:

sudo touch /etc/rc.local sudo chmod +x /etc/rc.local sudo vim /etc/rc.local

写入以下内容:

#!/bin/bash # 测试脚本:记录启动时间与主机名 echo "System boot at $(date)" >> /home/ubuntu/boot.log echo "Hostname: $(hostname)" >> /home/ubuntu/boot.log # 启动自定义脚本(示例) # /home/ubuntu/startup_script.sh & exit 0

关键点

  • 必须以#!/bin/bash开头
  • 结尾必须有exit 0,否则 systemd 认为脚本未结束
  • 耗时命令后加&放入后台,避免阻塞启动

3.4 建立软链接并启用服务

某些系统需要将服务文件链接到/etc/systemd/system/

sudo ln -s /lib/systemd/system/rc-local.service /etc/systemd/system/rc-local.service

启用并启动服务:

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

检查状态:

sudo systemctl status rc-local

预期输出包含:

Active: active (exited) since ...

3.5 验证效果

重启系统:

sudo reboot

登录后查看日志:

cat /home/ubuntu/boot.log

应看到类似输出:

System boot at Mon Apr 5 10:23:45 UTC 2025 Hostname: ubuntu

这表明rc.local已成功执行。


4. 树莓派4B 实战案例:语音播报开机脚本

4.1 场景说明

我们将在 Raspberry Pi 4B 上实现一个实用功能:系统启动时自动语音播报欢迎语。该案例涵盖依赖安装、Python 脚本编写和rc.local集成。

4.2 安装 espeak 语音库

espeak 是轻量级语音合成工具,适用于嵌入式设备:

sudo apt-get update sudo apt-get install espeak -y

测试语音功能:

espeak "Hello from Raspberry Pi"

应能听到语音输出。

4.3 编写 Python 播报脚本

创建脚本文件:

cd /home/pi nano speak_on_boot.py

写入以下代码:

#!/usr/bin/env python from subprocess import call # 播报欢迎语 message = "Welcome to the world of Raspberry Pi" call(['espeak "{}"'.format(message)], shell=True)

保存并赋予可执行权限:

chmod +x speak_on_boot.py

测试运行:

python speak_on_boot.py

4.4 配置 rc.local 自动启动

编辑rc.local文件:

sudo chmod +x /etc/rc.local sudo nano /etc/rc.local

exit 0前添加:

# 启动语音播报脚本(后台运行) python /home/pi/speak_on_boot.py & > /home/pi/boot_log.txt 2>&1

解释

  • &:后台运行,防止阻塞系统启动
  • > log.txt 2>&1:将标准输出和错误重定向到日志文件,便于调试

4.5 重启验证

sudo reboot

重启后应听到语音播报。若无声,请检查:

  • 音频输出是否正确(HDMI/耳机)
  • 用户是否有音频设备权限
  • 日志文件/home/pi/boot_log.txt是否生成

5. 常见问题与最佳实践

5.1 启动卡死问题排查

现象:系统重启后停留在启动画面,无法进入桌面或终端。

原因分析:

  • rc.local中有阻塞式命令未放入后台
  • 脚本等待用户输入
  • 无限循环未设置退出条件

解决方案:

  • 所有长时任务加&
  • 使用nohup防止被中断
  • 示例修正:
    # 错误写法 python /home/pi/listen.py # 正确写法 nohup python /home/pi/listen.py > /tmp/listen.log 2>&1 &

5.2 权限与路径问题

  • 使用绝对路径:避免因$PATH不一致导致命令找不到
    # 推荐 /usr/bin/python /home/pi/script.py
  • 确保脚本可执行
    sudo chmod +x /path/to/script.sh
  • 避免依赖 GUI 环境rc.local在图形界面启动前运行

5.3 日志记录建议

为便于调试,建议在脚本中添加日志:

echo "$(date): Starting custom script..." >> /var/log/startup.log

或统一重定向:

your_command & >> /var/log/rc-local.log 2>&1

5.4 替代方案对比

方案优点缺点适用场景
rc.local简单直观,兼容性好需手动启用,调试不便快速原型、小型项目
systemd服务功能强大,支持依赖管理学习成本高生产环境、复杂服务
cron @reboot用户级可用,无需 root执行时机较早,可能网络未就绪桌面用户、非关键任务

6. 总结

rc.local虽然“古老”,但在许多实际场景中依然具有不可替代的价值。通过本文的学习,你应该已经掌握了:

  1. rc.local的工作机制:理解其在系统启动流程中的位置与权限特性
  2. Ubuntu 下的完整配置流程:从修复rc-local.service到启用服务
  3. 树莓派实战应用:结合 Python 与 espeak 实现语音播报
  4. 避坑指南:避免因脚本阻塞导致系统无法启动
  5. 工程化建议:日志、路径、权限的最佳实践

无论你是搭建家庭服务器、开发嵌入式设备,还是进行自动化测试,rc.local都是一个值得掌握的基础技能。


获取更多AI镜像

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

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

多智能体协同技术研究

目录 引言 一、技术架构对比 1.1 阿里多智能体协同技术架构 1.2 字节多智能体协同技术架构 1.3 技术架构特点对比分析 二、核心能力对比 2.1 通信机制对比 2.2 决策算法对比 2.3 协作模式对比 三、案例应用实践 3.1 阿里多智能体协同应用案例 3.2 字节多智能体协同…

作者头像 李华
网站建设 2026/6/23 1:53:30

部署bge-large-zh-v1.5总出错?预置镜像省心方案来了

部署bge-large-zh-v1.5总出错?预置镜像省心方案来了 你是不是也正在为部署 bge-large-zh-v1.5 模型而头疼?明明只是想做个垂直领域的搜索引擎,结果却卡在环境配置上整整一周——依赖装不上、CUDA 版本不匹配、PyTorch 和 Transformers 对不上…

作者头像 李华
网站建设 2026/6/6 15:54:40

BGE-Reranker-v2-m3与LLM协同:生成前过滤最佳实践

BGE-Reranker-v2-m3与LLM协同:生成前过滤最佳实践 1. 技术背景与核心价值 在当前的检索增强生成(RAG)系统中,向量数据库通过语义相似度进行初步文档召回,已成为提升大语言模型(LLM)知识覆盖能…

作者头像 李华
网站建设 2026/6/19 18:42:19

基于Qwen1.5-0.5B-Chat的FAQ机器人搭建详细步骤

基于Qwen1.5-0.5B-Chat的FAQ机器人搭建详细步骤 1. 引言 1.1 轻量级对话模型的应用背景 随着企业对自动化客服、智能知识库和内部支持系统的需求不断增长,构建一个高效、低成本且易于维护的FAQ机器人成为许多中小团队的核心诉求。传统大参数量语言模型虽然具备强…

作者头像 李华
网站建设 2026/6/15 12:59:27

无需GPU!用中文情感分析镜像实现高效文本情绪识别

无需GPU!用中文情感分析镜像实现高效文本情绪识别 1. 背景与需求:轻量级中文情感分析的现实挑战 在当前自然语言处理(NLP)广泛应用的背景下,中文情感分析已成为客服系统、舆情监控、用户反馈处理等场景中的核心技术之…

作者头像 李华
网站建设 2026/6/20 19:25:50

opencode错误修复建议实战:真实Bug案例处理流程

opencode错误修复建议实战:真实Bug案例处理流程 1. 引言 1.1 业务场景描述 在现代AI驱动的开发环境中,开发者越来越依赖智能编码助手来提升效率。OpenCode 作为一个2024年开源的终端优先AI编程框架,凭借其多模型支持、隐私安全和插件化架构…

作者头像 李华