news 2026/6/24 11:34:06

5分钟搞定Ubuntu开机自启动,测试脚本一键部署指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
5分钟搞定Ubuntu开机自启动,测试脚本一键部署指南

5分钟搞定Ubuntu开机自启动,测试脚本一键部署指南

1. 为什么需要一个通用的开机自启动方案

你有没有遇到过这样的情况:写好了一个监控脚本、数据采集程序或者环境检测工具,每次重启Ubuntu都要手动运行一次?更麻烦的是,有些教程教的方法在不同版本的Ubuntu上表现不一致——有的在20.04能用,到了22.04就失效;有的依赖图形界面,服务器环境下根本跑不起来。

这个问题的核心在于:不是所有“开机自启动”都真正可靠。桌面环境的启动器、crontab的@reboot、甚至某些GUI配置工具,都存在启动时机不可控、权限不足、依赖服务未就绪等问题。

而本文要介绍的方案,基于systemd服务机制——这是现代Ubuntu(16.04及以后)默认且唯一推荐的系统级服务管理方式。它不依赖桌面会话,启动顺序可控,权限明确,失败可查,而且一次配置,永久生效。

更重要的是,这个方案完全适配你手头的镜像——“测试开机启动脚本”。它已经预置了核心结构,你只需要三步:放脚本、写服务、启用服务。整个过程5分钟内完成,连重启都不用等,用systemctl start就能立刻验证效果。

我们不讲抽象原理,只聚焦一件事:让你的测试脚本,在每次开机时稳稳当当地跑起来

2. 理解systemd服务的工作逻辑

2.1 服务的本质是什么

简单说,systemd服务就是一个文本文件,后缀是.service,里面用清晰的段落(Section)告诉系统:“我要做什么”、“什么时候做”、“以谁的身份做”。

它不像老式init脚本那样靠一堆if-else判断状态,而是通过声明式语法(Declarative)直接定义行为。比如:

  • [Unit]段说明“这个服务和其他服务的关系”——它得等网络就绪了再启动;
  • [Service]段说明“具体执行什么”——运行哪个脚本、用什么用户、出错了怎么处理;
  • [Install]段说明“要不要开机自启”——只要设为WantedBy=multi-user.target,systemd就知道该把它放进启动队列。

这种设计让服务变得极其稳定:系统知道你的脚本依赖网络,就不会在网络还没通的时候强行启动它;它知道你是用root身份运行,就不会因为权限问题卡在半路。

2.2 为什么选Type=simple而不是forking

你可能在其他教程里见过Type=forking,那是为传统守护进程(daemon)准备的,比如nginx、mysql这类自己会后台化(fork+exit)的程序。但我们的测试脚本test.sh不是守护进程——它执行完就退出,不长期驻留内存。

所以必须用Type=simple:systemd会把ExecStart命令当作主进程来管理,启动成功与否一目了然,日志也干净清晰。如果误用了forking,systemd会一直等一个它永远等不到的“子进程PID”,最终超时失败。

2.3 用户权限的关键提醒

注意服务文件里的这一行:

User=root

这不是为了“图省事”,而是有实际考量。很多测试脚本需要访问硬件设备(如串口)、读取系统日志、或写入全局路径(如/var/log)。普通用户权限受限,容易在开机阶段静默失败。

当然,如果你的脚本只操作自己家目录下的文件,完全可以改成User=yourusername,更安全。但对“测试开机启动脚本”这个镜像来说,root权限确保了最大兼容性,避免因权限问题导致调试走弯路。

3. 三步完成部署:从零到自动运行

3.1 第一步:准备你的测试脚本

打开终端,进入桌面目录(这是镜像默认工作区):

cd /home/Ubuntu/Desktop

创建test.sh脚本。注意:这里用的是标准Linux换行符(LF),不要用Windows的CRLF,否则会报错/bin/bash^M: bad interpreter

cat > test.sh << 'EOF' #!/bin/bash # 记录启动时间与当前状态 TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S') echo "[$TIMESTAMP] 开机自启动测试脚本已执行" >> /home/Ubuntu/Desktop/test.log # 可选:添加一行系统信息,方便后续排查 echo " 系统负载: $(uptime)" >> /home/Ubuntu/Desktop/test.log echo " 当前用户: $(whoami)" >> /home/Ubuntu/Desktop/test.log echo "---" >> /home/Ubuntu/Desktop/test.log EOF

赋予执行权限:

chmod +x test.sh

现在你可以手动运行一次,确认脚本本身没问题:

./test.sh tail -n 5 /home/Ubuntu/Desktop/test.log

你应该看到类似这样的输出:

[2024-06-15 14:22:37] 开机自启动测试脚本已执行 系统负载: 14:22:37 up 1 day, 3:15, 1 user, load average: 0.01, 0.02, 0.05 当前用户: Ubuntu ---

3.2 第二步:编写AutoRun.service服务文件

在同一个目录下,创建服务定义文件:

cat > AutoRun.service << 'EOF' [Unit] Description=AutoRun-Service for testing startup After=network.target [Service] Type=simple User=root WorkingDirectory=/home/Ubuntu/Desktop ExecStart=/home/Ubuntu/Desktop/test.sh [Install] WantedBy=multi-user.target EOF

对比参考文档,我们做了几处关键优化:

  • Description更具体,便于后续用systemctl list-units快速识别;
  • 去掉了原示例中多余的start参数(ExecStart=.../test.sh start),因为我们的脚本不需要命令行参数,直接执行即可;
  • 保留After=network.target,确保网络可用后再启动,这对后续可能扩展的网络请求类测试很关键。

3.3 第三步:安装并启用服务

现在把服务文件放到systemd的标准位置:

sudo cp AutoRun.service /etc/systemd/system/ sudo chmod 644 /etc/systemd/system/AutoRun.service

注意权限:.service文件必须是644(所有者可读写,组和其他人只读),755反而会导致systemd拒绝加载。

接着重载配置并启用开机自启:

sudo systemctl daemon-reload sudo systemctl enable AutoRun.service

最后,立即启动服务进行验证(无需重启):

sudo systemctl start AutoRun.service

检查状态是否正常:

sudo systemctl status AutoRun.service --no-pager -l

如果看到active (running)Started AutoRun-Service...,说明一切顺利。再看日志:

tail -n 10 /home/Ubuntu/Desktop/test.log

你会看到新追加的一条记录,时间就是刚才systemctl start的时刻。

4. 验证与调试:确保每次开机都可靠

4.1 模拟真实开机流程

别急着关机测试。先用systemd的模拟机制验证启动顺序:

systemctl list-dependencies --reverse multi-user.target | grep AutoRun

如果输出中包含AutoRun.service,说明它已被正确加入multi-user.target的依赖链,开机时必然触发。

再检查服务是否真的被启用:

systemctl is-enabled AutoRun.service

返回enabled即表示已注册为开机自启。

4.2 查看详细日志定位问题

如果某次启动后没看到日志,别猜。直接查journal:

sudo journalctl -u AutoRun.service --since "1 hour ago" --no-pager

常见错误及解决:

  • Failed at step EXEC spawning:通常是脚本路径写错,或test.sh没有+x权限;
  • Permission denied:检查User=设置是否与脚本所需权限匹配;
  • No such file or directoryWorkingDirectoryExecStart中的路径不存在,注意必须用绝对路径;
  • code=exited, status=203/EXEC:脚本第一行#!/bin/bash缺失或格式错误(比如有BOM头)。

4.3 安全退出与优雅清理

测试完成后,如果你想临时禁用自启(比如要改脚本),只需:

sudo systemctl disable AutoRun.service sudo systemctl stop AutoRun.service

想彻底删除服务:

sudo systemctl disable AutoRun.service sudo rm /etc/systemd/system/AutoRun.service sudo systemctl daemon-reload

记住:daemon-reload必须在删除后执行,否则systemd缓存里还留着旧定义。

5. 进阶技巧:让测试更灵活、更实用

5.1 支持多种启动模式:开机+唤醒双触发

参考文档提到了休眠唤醒场景。其实,systemd原生支持OnActiveSec=OnBootSec=,但更通用的做法是监听系统事件。

test.sh开头加入判断:

# 在test.sh最顶部添加 if [ "$1" = "resume" ]; then echo "[$(date)] 从休眠唤醒后执行" >> /home/Ubuntu/Desktop/test.log exit 0 fi

然后创建另一个服务AutoResume.service,内容如下:

[Unit] Description=AutoResume after Suspend After=suspend.target [Service] Type=oneshot User=root ExecStart=/home/Ubuntu/Desktop/test.sh resume [Install] WantedBy=suspend.target

启用它:sudo systemctl enable AutoResume.service。这样,无论是开机还是从休眠唤醒,你的测试逻辑都能覆盖。

5.2 日志轮转:避免test.log无限增长

长期运行的测试脚本,日志文件会越来越大。用logrotate轻松解决:

创建/etc/logrotate.d/testlog

/home/Ubuntu/Desktop/test.log { daily missingok rotate 7 compress delaycompress notifempty create 644 Ubuntu Ubuntu }

这样每天自动归档,保留7天,旧日志自动压缩,完全不用你操心。

5.3 一键部署脚本:把三步合成一个命令

把前面所有命令打包成deploy-autostart.sh,放在桌面:

cat > deploy-autostart.sh << 'EOF' #!/bin/bash set -e # 创建测试脚本 cat > /home/Ubuntu/Desktop/test.sh << 'SCRIPT' #!/bin/bash TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S') echo "[$TIMESTAMP] 开机自启动测试脚本已执行" >> /home/Ubuntu/Desktop/test.log echo " 系统负载: $(uptime)" >> /home/Ubuntu/Desktop/test.log echo " 当前用户: $(whoami)" >> /home/Ubuntu/Desktop/test.log echo "---" >> /home/Ubuntu/Desktop/test.log SCRIPT chmod +x /home/Ubuntu/Desktop/test.sh # 创建服务文件 cat > /home/Ubuntu/Desktop/AutoRun.service << 'SERVICE' [Unit] Description=AutoRun-Service for testing startup After=network.target [Service] Type=simple User=root WorkingDirectory=/home/Ubuntu/Desktop ExecStart=/home/Ubuntu/Desktop/test.sh [Install] WantedBy=multi-user.target SERVICE # 安装服务 sudo cp /home/Ubuntu/Desktop/AutoRun.service /etc/systemd/system/ sudo chmod 644 /etc/systemd/system/AutoRun.service sudo systemctl daemon-reload sudo systemctl enable AutoRun.service sudo systemctl start AutoRun.service echo " 部署完成!" echo " 日志查看:tail -f /home/Ubuntu/Desktop/test.log" echo " 服务状态:sudo systemctl status AutoRun.service" EOF chmod +x deploy-autostart.sh

运行它:./deploy-autostart.sh。所有步骤自动执行,出错即停,清晰提示。

6. 总结:你已经掌握了一个生产级的启动方案

回顾这5分钟,你完成了:

  • 理解了systemd服务的核心逻辑,知道为什么它比其他方法更可靠;
  • 编写了可执行的test.sh,并验证了其功能;
  • 创建了符合规范的AutoRun.service,明确了各段落的作用;
  • 成功安装、启用并即时启动了服务,亲眼看到日志生成;
  • 掌握了日志查询、状态检查、问题定位等调试技能;
  • 还拓展了休眠唤醒支持、日志轮转和一键部署等实用技巧。

这个方案不是玩具,它是Ubuntu官方推荐的、企业级服务部署的基础。你现在部署的不仅是一个测试脚本,更是未来运行监控程序、数据同步服务、AI推理守护进程的最小可行模板。

下一步,你可以把任何Python脚本、Node.js应用,甚至Docker容器启动命令,按同样结构填进ExecStart,它就会在每次开机时准时就位。

真正的自动化,从来不是追求“黑科技”,而是用最标准的工具,做最扎实的事。


获取更多AI镜像

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

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

开源大模型部署趋势一文详解:BAAI/bge-m3如何赋能AI知识库

开源大模型部署趋势一文详解&#xff1a;BAAI/bge-m3如何赋能AI知识库 1. 为什么语义相似度正在成为AI知识库的“隐形地基” 你有没有遇到过这样的情况&#xff1a;在企业知识库搜索“客户投诉处理流程”&#xff0c;结果返回的却是“售后服务政策全文”——内容相关&#xf…

作者头像 李华
网站建设 2026/6/16 8:49:34

Qwen2.5-1.5B生产环境落地:中小团队低成本构建内部知识问答系统

Qwen2.5-1.5B生产环境落地&#xff1a;中小团队低成本构建内部知识问答系统 1. 为什么中小团队需要一个“能用、敢用、省心用”的本地问答助手&#xff1f; 你有没有遇到过这些场景&#xff1f; 新员工入职&#xff0c;反复问“报销流程怎么走”“合同模板在哪找”&#xff…

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

ChatGLM-6B开发套件:HuggingFace模型加载技巧

ChatGLM-6B开发套件&#xff1a;HuggingFace模型加载技巧 1. 为什么需要掌握ChatGLM-6B的HuggingFace加载方法 你可能已经用过CSDN镜像里开箱即用的ChatGLM-6B WebUI&#xff0c;点几下就能和模型聊上天。但如果你真想把它用进自己的项目——比如嵌入到企业客服系统、集成到内…

作者头像 李华
网站建设 2026/6/24 1:41:49

电商设计灵感来源!Z-Image-Turbo_UI界面AI出图实战

电商设计灵感来源&#xff01;Z-Image-Turbo_UI界面AI出图实战 Z-Image-Turbo、UI界面出图、电商海报生成、AI设计工具、本地浏览器运行、零代码生图、商品主图优化、一键部署、电商视觉提效 作为一个做了六年电商前端和视觉运营的老手&#xff0c;我每天最头疼的不是写代码&am…

作者头像 李华
网站建设 2026/6/19 0:19:16

Glyph镜像使用全记录:我是如何30分钟跑通的

Glyph镜像使用全记录&#xff1a;我是如何30分钟跑通的 1. 为什么是Glyph&#xff1f;一个被低估的视觉推理新思路 你有没有试过让大模型“读懂”一张密密麻麻的PDF截图&#xff1f;或者让它从一张带表格的财务报告图里准确提取数据&#xff1f;又或者&#xff0c;面对一页扫…

作者头像 李华
网站建设 2026/6/15 20:43:48

亲测IndexTTS-2-LLM:离线语音合成效果超预期

亲测IndexTTS-2-LLM&#xff1a;离线语音合成效果超预期 最近在本地部署了一套语音合成服务&#xff0c;不是调用API&#xff0c;也不是跑在云端&#xff0c;而是真真正正装在自己电脑上、断网也能用的智能TTS系统。试了几天&#xff0c;从第一句“你好&#xff0c;今天天气不…

作者头像 李华