news 2026/2/6 12:32:36

自动化第一步:让脚本在开机时自动拉起

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
自动化第一步:让脚本在开机时自动拉起

自动化第一步:让脚本在开机时自动拉起

1. 引言

1.1 业务场景描述

在嵌入式设备、边缘计算节点或远程服务器的运维中,常常需要确保某些关键任务脚本(如数据采集、服务监控、日志上传等)能够在系统重启后自动运行。手动启动不仅效率低下,还容易因人为疏忽导致服务中断。

1.2 痛点分析

传统的rc.local方式在现代 Linux 发行版中已被逐步弃用或限制执行权限,且对依赖网络、文件系统挂载等条件的脚本支持不佳。开发者常遇到“脚本未执行”“路径找不到”“权限不足”等问题。

1.3 方案预告

本文将基于systemd机制,详细介绍如何创建一个可靠的开机自启动服务,确保你的脚本在系统启动完成后自动拉起,并具备失败重启、日志追踪等生产级能力。


2. 技术方案选型

2.1 可选方案对比

方案优点缺点适用场景
rc.local配置简单,传统方式权限受限,不支持依赖管理快速验证,非关键任务
crontab @reboot用户级配置,无需 root执行环境受限,无状态管理简单用户脚本
systemd 服务支持依赖控制、失败重启、日志集成、权限隔离需要编写服务文件生产环境、关键任务

推荐选择:systemd 服务—— 更适合工程化部署和长期稳定运行。


3. 实现步骤详解

3.1 创建 systemd 服务文件

首先,在/etc/systemd/system/目录下创建一个以.service结尾的服务文件。建议命名清晰,体现功能意图。

sudo nano /etc/systemd/system/mirror-test-boot.service

输入以下内容:

[Unit] Description=Test Script for Mirror Boot Auto-Start After=network.target syslog.target [Service] Type=simple ExecStart=/bin/bash /home/orangepi/mjpg.sh Restart=on-failure RestartSec=5 User=orangepi Group=orangepi StandardOutput=journal StandardError=journal Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin [Install] WantedBy=multi-user.target
参数说明:
  • Description: 服务描述,便于识别。
  • After=network.target: 确保网络就绪后再启动脚本。
  • Type=simple: 默认类型,表示主进程由ExecStart直接启动。
  • ExecStart: 指定脚本完整路径,使用/bin/bash明确解释器。
  • Restart=on-failure: 失败时自动重启,提升可靠性。
  • RestartSec=5: 重启间隔 5 秒,避免频繁重试。
  • UserGroup: 指定运行身份,避免权限问题(请根据实际用户修改)。
  • StandardOutput/Error=journal: 输出写入系统日志,便于调试。
  • Environment: 显式设置 PATH,防止命令找不到。

⚠️ 注意:务必确认/home/orangepi/mjpg.sh脚本存在且具有可执行权限:

chmod +x /home/orangepi/mjpg.sh

3.2 重新加载 systemd 配置

每次新增或修改.service文件后,必须通知 systemd 重新加载配置:

sudo systemctl daemon-reload

这一步是必须的,否则后续操作会失败或无效。


3.3 启用并启动服务

启用服务,使其在下次开机时自动运行:

sudo systemctl enable mirror-test-boot.service

输出应为:

Created symlink /etc/systemd/system/multi-user.target.wants/mirror-test-boot.service → /etc/systemd/system/mirror-test-boot.service.

立即启动服务进行测试:

sudo systemctl start mirror-test-boot.service

检查服务状态:

sudo systemctl status mirror-test-boot.service

正常输出示例:

● mirror-test-boot.service - Test Script for Mirror Boot Auto-Start Loaded: loaded (/etc/systemd/system/mirror-test-boot.service; enabled; vendor preset: enabled) Active: active (running) since Mon 2025-04-05 10:00:00 CST; 1min ago Main PID: 1234 (bash) Tasks: 2 (limit: 4915) CGroup: /system.slice/mirror-test-boot.service ├─1234 /bin/bash /home/orangepi/mjpg.sh └─1235 /usr/bin/python3 camera.py

3.4 查看日志输出

若服务未按预期运行,可通过 journalctl 查看详细日志:

sudo journalctl -u mirror-test-boot.service -f

常用参数:

  • -f: 实时跟踪日志(类似tail -f
  • --since "1 hour ago": 查看最近一小时日志
  • -n 50: 显示最后 50 行

示例输出:

Apr 05 10:00:00 orangepi bash[1234]: Starting MJPG streamer... Apr 05 10:00:01 orangepi bash[1234]: Camera initialized successfully.

4. 实践问题与优化

4.1 常见问题及解决方案

问题现象可能原因解决方法
服务启动失败,提示“no such file”路径错误或脚本不存在使用绝对路径,确认文件存在
提示“Permission denied”脚本无执行权限或用户无权访问chmod +x script.sh,检查用户权限
脚本依赖网络但提前启动After=设置不当添加After=network.target
环境变量缺失导致命令无法执行PATH 不完整[Service]中显式设置Environment=PATH=...
日志显示脚本已启动但无实际效果脚本内部逻辑阻塞或退出检查脚本是否后台运行或守护进程化

4.2 性能与稳定性优化建议

  1. 添加超时保护如果脚本可能卡死,可在[Service]中添加:

    TimeoutStartSec=30 KillMode=process
  2. 限制资源使用防止脚本耗尽系统资源:

    MemoryLimit=512M CPUQuota=80%
  3. 设置启动延迟(可选)若需等待其他服务完全就绪:

    ExecStartPre=/bin/sleep 10
  4. 使用专用用户运行创建独立用户运行脚本,提高安全性:

    sudo useradd -r -s /bin/false mirroruser

    然后在服务中设置User=mirroruser


5. 完整可运行代码示例

5.1 示例脚本mjpg.sh

#!/bin/bash # 脚本路径:/home/orangepi/mjpg.sh # 功能:启动一个模拟摄像头流服务 LOGFILE="/var/log/mjpg-start.log" exec >> $LOGFILE 2>&1 echo "[$(date)] Starting MJPG streamer..." # 检查依赖 if ! command -v python3 &> /dev/null; then echo "python3 not found!" exit 1 fi # 进入工作目录 cd /home/orangepi || exit 1 # 启动模拟服务(示例) nohup python3 -c " import time while True: print('Streaming frame at:', time.ctime()) time.sleep(2) " & echo "MJPG streamer started with PID $!" exit 0

赋予执行权限:

chmod +x /home/orangepi/mjpg.sh

5.2 对应的 systemd 服务文件(完整版)

[Unit] Description=MJPG Streamer Auto Start on Boot After=network.target syslog.target Requires=network.target [Service] Type=simple ExecStart=/bin/bash /home/orangepi/mjpg.sh Restart=on-failure RestartSec=5 User=orangepi Group=orangepi StandardOutput=journal StandardError=journal Environment=PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin TimeoutStartSec=30 KillMode=process [Install] WantedBy=multi-user.target

6. 总结

6.1 实践经验总结

通过本次实践,我们掌握了使用systemd实现脚本开机自启的核心流程:

  • 编写结构清晰的服务单元文件
  • 正确设置依赖关系与执行上下文
  • 利用systemctl工具链完成启用、启动、状态查看
  • 借助journalctl快速定位问题

相比传统方式,systemd提供了更强的可控性和可观测性,是现代 Linux 系统自动化运维的首选方案。

6.2 最佳实践建议

  1. 始终使用绝对路径:避免因工作目录不确定导致失败。
  2. 明确指定运行用户:提升安全性和权限可控性。
  3. 开启失败重启机制:增强服务韧性。
  4. 集成日志输出:便于后期维护和故障排查。
  5. 定期测试重启流程:确保配置持久有效。

获取更多AI镜像

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

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

实战案例:成功配置ESP-IDF并绕过路径验证错误

绕过idf.py not found陷阱:一个ESP32开发者的血泪调试实录最近接手一个基于ESP32的新项目,刚打开终端准备敲下那句熟悉的idf.py build,屏幕却毫不留情地弹出:The path for ESP-IDF is not valid: /tools/idf.py not found. Please…

作者头像 李华
网站建设 2026/2/3 23:06:38

verl监控体系:训练过程中的指标采集与可视化

verl监控体系:训练过程中的指标采集与可视化 1. verl 介绍 verl 是一个灵活、高效且可用于生产环境的强化学习(RL)训练框架,专为大型语言模型(LLMs)的后训练设计。它由字节跳动火山引擎团队开源&#xff…

作者头像 李华
网站建设 2026/2/6 7:52:09

IndexTTS 2.0硬件选型:最低配置也能跑通的部署方案

IndexTTS 2.0硬件选型:最低配置也能跑通的部署方案 1. 引言:为什么需要低门槛语音合成部署? 还在为找不到贴合人设的配音发愁?试试 B 站开源的 IndexTTS 2.0!这款自回归零样本语音合成模型,支持上传人物音…

作者头像 李华
网站建设 2026/2/6 6:40:28

游戏本地化配置指南:从零基础到专业级的技术实践

游戏本地化配置指南:从零基础到专业级的技术实践 【免费下载链接】Degrees-of-Lewdity-Chinese-Localization Degrees of Lewdity 游戏的授权中文社区本地化版本 项目地址: https://gitcode.com/gh_mirrors/de/Degrees-of-Lewdity-Chinese-Localization 还在…

作者头像 李华
网站建设 2026/2/3 6:35:58

通义千问3-Embedding-4B实战:学术论文相似度检测

通义千问3-Embedding-4B实战:学术论文相似度检测 1. 引言 在当前大规模文本处理和信息检索的背景下,高效、精准的语义向量化模型成为构建知识库、实现文档去重与相似性匹配的核心技术。随着多语言、长文本场景需求的增长,传统小尺寸嵌入模型…

作者头像 李华