news 2026/4/3 4:53:24

从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/4/1 13:31:04

模拟电子技术基础:二极管整流电路仿真图解说明

从波形看本质:二极管整流电路的仿真图解与实战解析你有没有想过,为什么手机充电器插上220V交流电,却能安全地给5V电池充电?这背后的第一步,就是把“来回振荡”的交流电变成“单向流动”的直流电——而完成这一关键转换…

作者头像 李华
网站建设 2026/3/28 15:22:30

Qwen3-4B API快速测试:云端免部署,1块钱验证想法

Qwen3-4B API快速测试:云端免部署,1块钱验证想法 你是不是也遇到过这样的情况?作为App开发者,想在产品里集成一个大模型API来提升用户体验——比如加个智能客服、自动摘要或者内容生成功能。但公司采购流程太慢,走正式…

作者头像 李华
网站建设 2026/3/26 17:52:01

没GPU怎么跑Python3.9?云端1小时1块,5分钟部署

没GPU怎么跑Python3.9?云端1小时1块,5分钟部署 你是不是也遇到过这种情况:作为一名数据分析师,手头有个紧急项目要用 Python 3.9 的新特性处理大量数据,比如用更简洁的字典合并语法、更高效的类型提示优化代码结构。可…

作者头像 李华
网站建设 2026/4/2 21:04:22

图片旋转判断模型调优指南:从入门到精通的云端实践

图片旋转判断模型调优指南:从入门到精通的云端实践 你有没有遇到过这样的情况:用户上传的照片方向五花八门,横着、倒着、斜着……手动调整不仅费时费力,还容易出错。作为一名机器学习工程师,你已经实现了一个基础的图…

作者头像 李华
网站建设 2026/4/2 2:54:56

语言学课堂新玩法:Hunyuan-MT-7B-WEBUI教学实践

语言学课堂新玩法:Hunyuan-MT-7B-WEBUI教学实践 在高校语言学、翻译学与跨文化传播课程中,学生对真实机器翻译系统的接触往往停留在理论层面。尽管神经网络翻译(NMT)已成为行业标准,但大多数教学仍依赖静态案例分析或…

作者头像 李华
网站建设 2026/3/15 0:35:42

Cute_Animal_For_Kids_Qwen_Image实测分享,打造专属儿童动物图库

Cute_Animal_For_Kids_Qwen_Image实测分享,打造专属儿童动物图库 1. 引言:为儿童内容创作注入AI动力 在数字教育和亲子互动日益普及的今天,高质量、安全且富有童趣的视觉内容成为家长和教育工作者的核心需求。传统的图片素材库虽然丰富&…

作者头像 李华