news 2026/7/2 0:29:31

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

作者头像

张小明

前端开发工程师

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/6/30 15:59:32

IndexTTS-2批量生成技巧:云端并行计算,效率提升10倍

IndexTTS-2批量生成技巧:云端并行计算,效率提升10倍 你是否正在为大量语音内容的生成速度发愁?比如要做有声书、短视频配音、课程录音,或者企业级的内容播报系统,结果发现用本地电脑跑IndexTTS-2,一条音频…

作者头像 李华
网站建设 2026/7/1 10:44:31

Z-Image-Turbo如何提效?自动化批量生成图像部署案例

Z-Image-Turbo如何提效?自动化批量生成图像部署案例 1. 引言:高效文生图的工程落地需求 随着AIGC技术的快速发展,AI图像生成已从实验室走向实际生产环境。在内容创作、广告设计、电商展示等场景中,对高质量、高效率图像生成的需…

作者头像 李华
网站建设 2026/6/29 22:37:10

Qwen1.5-0.5B-Chat快速迁移:模型文件备份与恢复实战教程

Qwen1.5-0.5B-Chat快速迁移:模型文件备份与恢复实战教程 1. 引言 1.1 学习目标 本文旨在为开发者提供一套完整、可复用的 Qwen1.5-0.5B-Chat 模型文件备份与恢复方案,适用于在资源受限环境(如低配云主机、边缘设备)中部署轻量级…

作者头像 李华
网站建设 2026/6/26 19:13:01

中文语音识别新选择:Paraformer镜像批量处理录音文件实战

中文语音识别新选择:Paraformer镜像批量处理录音文件实战 1. 引言 在语音技术快速发展的今天,中文语音识别(ASR)已成为智能办公、会议记录、教育培训等场景的核心工具。然而,传统自回归模型虽然精度高,但…

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

Yolo-v5模型对比:1小时低成本测试3个版本

Yolo-v5模型对比:1小时低成本测试3个版本 你是不是也遇到过这样的情况:项目要上线,目标检测任务迫在眉睫,但团队里好几个工程师都在排队等GPU资源?公司服务器紧张,一等就是半天,效率低得让人心…

作者头像 李华
网站建设 2026/6/30 0:01:02

SenseVoice零基础教程:云端GPU免配置,1小时1块快速体验

SenseVoice零基础教程:云端GPU免配置,1小时1块快速体验 你是不是也刷到过B站上那些“能听懂情绪”的语音识别视频?输入一段录音,不仅能准确转成文字,还能告诉你说话人是开心、生气还是无奈,甚至标注出背景…

作者头像 李华