遵义市网站建设_网站建设公司_无障碍设计_seo优化
2026/1/17 0:36:16 网站建设 项目流程

5分钟搞定Linux开机自启,测试脚本一键部署实测

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

在嵌入式设备、服务器运维和自动化测试场景中,系统开机后自动执行特定脚本或程序是一项基础但关键的需求。无论是树莓派上运行环境监测程序,还是云服务器自动拉起服务进程,手动干预不仅效率低下,还容易因人为疏忽导致服务中断。

本文以“测试开机启动脚本”镜像为实践载体,结合 Ubuntu 虚拟机与树莓派 4B 的真实案例,手把手带你掌握 Linux 系统下主流的开机自启方案。全程操作控制在5分钟内可完成,适合快速验证和批量部署。

目标读者将通过本文:

  • ✅ 理解三种主流开机自启机制的核心差异
  • ✅ 掌握rc.localsystemd的完整配置流程
  • ✅ 完成一个可验证的开机打印脚本部署
  • ✅ 避免常见卡死系统、权限不足等典型问题

2. Linux 开机自启机制概览

Linux 系统的启动过程由初始化系统(init system)管理,目前主流发行版普遍采用systemd作为默认 init 系统。不同的自启方式对应不同阶段的系统加载时机和权限模型。

方式适用系统执行时机权限级别是否推荐
rc.local多数传统发行版所有服务启动后root⚠️ 兼容性使用
systemdsystemd 系统(Ubuntu 16+、CentOS 7+)按依赖顺序启动可配置用户/系统级✅ 推荐
init.dSysVinit 系统启动早期root❌ 已淘汰

核心建议:优先使用systemd实现服务化管理;对于简单调试任务,可临时启用rc.local快速验证。


3. 方法一:通过 rc.local 实现开机执行(兼容模式)

尽管 Ubuntu 18.04 及以后版本默认禁用了/etc/rc.local,但我们可以通过恢复其 systemd 单元文件来重新启用这一经典方式,特别适合快速测试类脚本。

3.1 检查并修复 rc-local.service

首先确认系统是否存在原始 service 文件:

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

若输出包含rc-local.service,则继续编辑该文件:

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

确保内容包含[Install]段落,否则添加如下配置:

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

3.2 创建并配置 /etc/rc.local 脚本

创建脚本文件:

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

写入以下测试内容(注意必须以#!/bin/sh开头,并以exit 0结尾):

#!/bin/sh -e # # rc.local # This script is executed at the end of each multiuser runlevel. echo "$(date): System booted, running startup script" >> /var/log/startup.log # 示例:运行用户目录下的测试脚本 /home/testuser/startup_test.sh || true exit 0

3.3 建立软链接并启用服务

sudo ln -s /lib/systemd/system/rc-local.service /etc/systemd/system/ sudo systemctl daemon-reload sudo systemctl enable rc-local sudo systemctl start rc-local

重要提示:任何在rc.local中调用的长时间运行脚本必须加&放入后台,否则会阻塞系统启动。例如:

/home/testuser/long_running_script.sh &

4. 方法二:使用 systemd 创建自定义服务(推荐方案)

systemd是现代 Linux 系统的标准服务管理器,支持精细化控制启动顺序、重启策略、日志记录等功能,是生产环境首选。

4.1 编写测试脚本

创建一个简单的日志生成脚本用于验证:

mkdir -p /home/testuser && cd /home/testuser cat > startup_test.sh << 'EOF' #!/bin/bash DATE=$(date '+%Y-%m-%d %H:%M:%S') echo "✅ Startup script executed at $DATE" >> /home/testuser/boot.log EOF chmod +x startup_test.sh

4.2 创建 systemd 服务单元文件

推荐使用系统级服务(所有用户生效),创建服务文件:

sudo vim /etc/systemd/system/test-startup.service

填入以下内容:

[Unit] Description=Test Startup Script After=network.target syslog.target Documentation=https://example.com/startup-guide [Service] Type=simple User=testuser WorkingDirectory=/home/testuser ExecStart=/home/testuser/startup_test.sh StandardOutput=journal StandardError=journal Restart=no [Install] WantedBy=multi-user.target
参数说明:
  • After=network.target:确保网络已就绪后再运行
  • User=testuser:以普通用户身份运行,提升安全性
  • Restart=no:仅运行一次,不重复启动
  • StandardOutput=journal:输出重定向至 journal 日志系统

4.3 启用并验证服务

# 重载配置 sudo systemctl daemon-reload # 启用开机自启 sudo systemctl enable test-startup.service # 立即启动一次(无需重启) sudo systemctl start test-startup.service # 查看状态 sudo systemctl status test-startup.service

查看执行结果:

cat /home/testuser/boot.log # 输出示例: # ✅ Startup script executed at 2025-04-05 10:20:30

4.4 查看日志(高级调试)

使用journalctl查看服务运行详情:

sudo journalctl -u test-startup.service --since today

5. 树莓派 4B 实战案例:语音播报欢迎语

本节基于 Raspberry Pi OS(Debian 衍生版)演示如何实现开机语音播报,展示rc.local在嵌入式场景中的典型应用。

5.1 安装 espeak 语音合成工具

sudo apt update sudo apt install -y espeak

测试语音功能:

espeak "Hello from Raspberry Pi"

5.2 编写 Python 调用脚本

cd /home/pi nano sample.py

输入以下代码:

#!/usr/bin/env python import subprocess import time # 延迟5秒等待音频设备初始化 time.sleep(5) subprocess.call(['espeak "Welcome to the world of Raspberry Pi" 2>/dev/null'], shell=True)

赋予执行权限:

chmod +x sample.py

5.3 配置 rc.local 自动调用

编辑启动脚本:

sudo nano /etc/rc.local

exit 0前插入:

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

保存后重启验证:

sudo reboot

注意事项

  • 使用sudo -u pi切换到 pi 用户避免权限问题
  • 添加&将进程放入后台,防止阻塞启动
  • 输出重定向便于后续排查问题

6. 常见问题与避坑指南

6.1 系统卡在启动界面无法进入桌面

原因rc.local中执行了前台阻塞程序且未加&

解决方案

  • 所有长时任务必须后台运行:command &
  • 添加超时保护:timeout 30 command &
  • 使用nohup防止被终止:nohup command &

6.2 权限拒绝或找不到命令

原因PATH环境变量未继承,或脚本无执行权限。

解决方法

  • 在脚本中显式指定路径:/usr/bin/python而非python
  • 给脚本赋权:chmod +x script.sh
  • .service文件中设置Environment=PATH=...

示例修复:

[Service] Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin

6.3 systemd 服务启动失败但无明显报错

使用以下命令深入排查:

# 查看详细状态 systemctl status your-service.service # 查看完整日志 journalctl -u your-service.service -b # 检查语法错误 systemd-analyze verify /etc/systemd/system/your-service.service

7. 总结

本文围绕“测试开机启动脚本”这一实际需求,系统讲解了 Linux 下两种核心自启方案的配置流程,并通过 Ubuntu 虚拟机与树莓派 4B 的双平台实测验证了可行性。

关键要点回顾:

  1. rc.local适用于快速测试,但在新系统中需手动恢复支持;
  2. systemd是现代系统的标准做法,支持更精细的服务控制;
  3. 所有前台脚本必须后台化运行(加&),否则会导致系统卡死;
  4. 合理使用日志输出和journalctl可大幅提升排错效率;
  5. 优先以非 root 用户运行服务,增强系统安全性。

通过本文提供的模板,你可以轻松将任意测试脚本、监控程序或自动化任务集成到系统启动流程中,实现真正的“一键部署、无人值守”。


获取更多AI镜像

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询