news 2026/2/10 6:34:45

开机启动原来这么简单,看完就会操作

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
开机启动原来这么简单,看完就会操作

开机启动原来这么简单,看完就会操作

你是不是也遇到过这样的问题:写好了一个监控脚本、一个数据采集程序,或者一个自动备份任务,每次重启系统后都要手动运行一次?既麻烦又容易忘记,关键还影响自动化流程的可靠性。其实,让脚本在开机时自动运行,并不像想象中那么复杂——不需要改内核、不用编译、更不用背命令,只要几步清晰的操作,就能稳稳搞定。

这篇文章不讲抽象原理,不堆术语,全程用你日常能接触到的命令和路径,手把手带你把“测试开机启动脚本”这个镜像真正用起来。无论你是刚接触Linux的新手,还是习惯图形界面、对终端有点生疏的开发者,都能照着做、立刻生效。我们聚焦一件事:怎么让自己的脚本,在系统一通电、一启动,就安静又可靠地跑起来。

1. 先搞清楚:为什么选 systemd 而不是老办法

过去有人用/etc/rc.local,也有人改crontab -e@reboot,但这些方式现在要么已被弃用,要么存在兼容性或权限隐患。比如:

  • /etc/rc.local在很多新版发行版(Ubuntu 20.04+、Debian 11+、CentOS 8+)中默认不启用,开启还要额外配置,且执行时机不可控;
  • @reboot依赖 cron 服务本身是否已就绪,而某些脚本(比如要访问网络或挂载磁盘的)可能因 cron 启动太早而失败。

systemd 是当前主流 Linux 发行版的标准初始化系统,它提供了明确的启动顺序控制、进程生命周期管理、自动重启保障、日志集成——这些都不是“锦上添花”,而是让脚本真正“稳住”的底层支撑。

你可以把它理解成一个智能管家:它知道你的脚本依赖网络、需要等硬盘挂好、希望失败时自动重试……你只需要告诉它“我想做什么”,剩下的它来安排。

所以,我们今天只学一种方法:用 systemd 写一个服务文件。它不难,而且一劳永逸。

2. 四步完成:从零创建一个开机自启服务

整个过程只需四步,每步都有明确目标和可验证结果。我们以镜像名称“测试开机启动脚本”为例,假设你已经把实际脚本(比如叫test-start.sh)放在了/home/pi/目录下。

2.1 第一步:确认脚本可执行且能独立运行

在让它开机跑之前,先确保它自己就能跑通。打开终端,执行:

# 给脚本添加执行权限(如果还没加) chmod +x /home/pi/test-start.sh # 手动运行一次,看有没有报错 /home/pi/test-start.sh

如果看到预期输出(比如打印一行“服务已启动”或生成一个日志文件),说明脚本本身没问题。
注意:脚本第一行必须是#!/bin/bash#!/usr/bin/env bash,否则 systemd 无法识别解释器。

2.2 第二步:创建 systemd 服务文件

systemd 通过.service文件来定义一个服务。我们把它放在标准位置/etc/systemd/system/下,文件名建议用小写字母+短横线,比如test-start.service

运行以下命令创建并编辑:

sudo nano /etc/systemd/system/test-start.service

然后粘贴以下内容(请逐行阅读注释,再修改对应部分):

[Unit] Description=测试开机启动脚本服务 After=multi-user.target # 如果脚本需要网络,可改为 After=network.target;如需等待特定挂载点,加 RequiresMountsFor=/path/to/mount [Service] Type=simple ExecStart=/bin/bash /home/pi/test-start.sh Restart=on-failure RestartSec=5 User=pi Group=pi StandardOutput=journal StandardError=journal # 如果脚本需要读取环境变量(如 PATH),可取消下一行注释并指定 # Environment="PATH=/usr/local/bin:/usr/bin:/bin" [Install] WantedBy=multi-user.target

关键点说明:

  • Description:服务描述,纯文字,方便你日后识别;
  • After=:控制启动顺序,multi-user.target表示等基础系统服务就绪后再启动,适合大多数场景;
  • ExecStart=:必须写绝对路径,不能用~$HOME
  • UserGroup:务必替换成你实际的用户名(如piubuntuyourname),不要留your_username
  • Restart=on-failure:只要脚本意外退出(非0状态码),systemd 就会自动重启它,RestartSec=5表示等5秒再试;
  • StandardOutput=journal:把脚本的打印内容自动存入系统日志,方便后续排查。

保存退出(nano 中按Ctrl+O → Enter → Ctrl+X)。

2.3 第三步:重新加载配置并启用服务

systemd 不会自动发现新文件,需要主动通知它:

# 告诉 systemd:“我新增了一个服务,请重新读一遍所有配置” sudo systemctl daemon-reload # 启用服务:即设置为开机自动启动 sudo systemctl enable test-start.service # 现在就可以手动启动一次,验证是否能正常运行 sudo systemctl start test-start.service

验证是否启用成功:运行systemctl is-enabled test-start.service,返回enabled即表示已注册到开机列表。

2.4 第四步:检查状态与日志,确认万无一失

启动后别急着关终端,马上检查:

# 查看服务当前状态(是否 active、有无报错) sudo systemctl status test-start.service # 查看脚本运行时的完整输出(包括 echo、printf 等打印内容) sudo journalctl -u test-start.service -n 20 --no-pager # 如果想持续跟踪日志(类似 tail -f),加 -f 参数 sudo journalctl -u test-start.service -f

如果status显示active (running),且journalctl里能看到你脚本的输出,恭喜,它已经活了。
此时你可以安全重启系统测试最终效果:

sudo reboot

重启后,再次登录,直接运行:

sudo systemctl status test-start.service

如果仍是active (running),说明整个链路完全打通——从断电开机,到脚本执行,全部自动完成。

3. 常见问题与实用技巧

实际部署中,总会遇到几个高频“卡点”。这里不列一堆报错代码,而是告诉你怎么快速定位、怎么改、为什么这么改

3.1 脚本运行了,但没输出?可能是权限或路径问题

现象:systemctl status显示active,但journalctl里空空如也。
原因往往有两个:

  • 脚本里用了相对路径(如./data/log.txt),systemd 默认工作目录是/,找不到文件;
  • 脚本依赖某个环境变量(如NODE_ENV=production),但 systemd 启动时不继承 shell 环境。

解决方案:

  • 在脚本开头显式切换工作目录:

    #!/bin/bash cd /home/pi || exit 1 # 确保进入正确目录
  • 或在 service 文件中用WorkingDirectory=指定:

    [Service] WorkingDirectory=/home/pi
  • 如需环境变量,在[Service]段添加:

    Environment="NODE_ENV=production" Environment="PATH=/usr/local/bin:/usr/bin:/bin"

3.2 脚本启动太快,网络还没通?加个等待逻辑

现象:脚本里调用了curl https://api.example.com,但开机时总失败。
原因:network.target只表示“网络服务已启动”,不代表网卡已获取 IP 或 DNS 已就绪。

推荐做法(比写 sleep 更可靠): 在 service 文件中,把After=改为:

After=network-online.target Wants=network-online.target

并确保系统已启用网络在线检测(多数发行版默认开启,可略过)。

3.3 想临时禁用,又不想删文件?用 mask 更安全

有时你想彻底停掉一个服务,连start命令都不让执行(防止误操作):

# 禁用并屏蔽(mask),相当于给服务加锁 sudo systemctl mask test-start.service # 解除屏蔽 sudo systemctl unmask test-start.service

mask会创建一个指向/dev/null的软链接,比disable更彻底,适合生产环境关键服务。

4. 进阶建议:让开机启动更健壮、更省心

做到上面四步,90% 的需求已经满足。如果你希望进一步提升稳定性或可维护性,可以考虑这几个轻量级优化。

4.1 给脚本加个守护循环(防意外退出)

有些脚本是单次执行就结束的(比如发个通知),但更多时候你需要它一直运行(比如监听端口、轮询数据库)。这时Type=simple可能不够。

替换为Type=exec并确保脚本自身不退出:

[Service] Type=exec ExecStart=/home/pi/long-running.sh Restart=always

同时,确保long-running.sh里没有exit,或者用while true; do ...; sleep 10; done包裹主逻辑。

4.2 日志自动轮转,避免占满磁盘

systemd 默认会保留日志,长期运行的服务可能积累大量日志。启用自动清理:

# 编辑 journald 配置 sudo nano /etc/systemd/journald.conf

取消以下两行注释并修改:

SystemMaxUse=100M MaxRetentionSec=2week

然后重启日志服务:

sudo systemctl restart systemd-journald

4.3 多脚本协同?用 target 单元统一管理

如果你有多个开机脚本(比如db-init.shcache-warm.shmonitor.sh),不建议每个都单独 enable。可以创建一个自定义 target,把它们组织起来:

sudo nano /etc/systemd/system/my-app.target

内容:

[Unit] Description=My Application Startup Bundle Wants=db-init.service cache-warm.service monitor.service Before=multi-user.target

然后enable my-app.target,所有依赖服务将按需启动,结构更清晰。

5. 总结:开机启动这件事,真的只是“四步”

回看整个过程,你会发现:所谓“系统级自动化”,并不需要你成为 Linux 内核专家,也不必啃完几百页文档。它本质是一套设计良好的约定——只要你按约定写好描述(service 文件)、告诉系统(daemon-reload)、登记注册(enable)、验证结果(status + journalctl),事情就成了。

  • 第一步验证脚本本身:确保它在终端里能跑,是所有自动化的前提;
  • 第二步写 service 文件:不是编程,是填空,把路径、用户、依赖关系说清楚;
  • 第三步启用并启动:两条命令,立竿见影;
  • 第四步查日志看状态:不是可选项,是闭环验证的最后一步。

这四步,你今天就能做完,明天就能用上。不需要记住所有参数,第一次照着改,第二次就能自己命名、调整顺序、加环境变量。真正的熟练,来自一次又一次的真实操作,而不是反复阅读理论。

现在,合上这篇文章,打开你的终端,挑一个最想自动化的脚本,动手试试吧。五分钟后,你就会发现:开机启动,原来真的这么简单。


获取更多AI镜像

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

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

2026年多语言AI落地入门必看:Hunyuan MT模型趋势一文详解

2026年多语言AI落地入门必看:Hunyuan MT模型趋势一文详解 1. HY-MT1.5-1.8B 模型介绍 混元翻译模型 1.5 版本包含一个 18 亿参数的翻译模型 HY-MT1.5-1.8B 和一个 70 亿参数的翻译模型 HY-MT1.5-7B。两个模型均专注于支持 33 种语言之间的互译,并融合了…

作者头像 李华
网站建设 2026/1/30 1:12:32

DIY航空监控:从零开始构建你的ADS-B信号接收系统

DIY航空监控:从零开始构建你的ADS-B信号接收系统 【免费下载链接】dump1090 项目地址: https://gitcode.com/gh_mirrors/dump/dump1090 一、揭开航空监控的神秘面纱:什么是ADS-B技术? 为什么我们能在地面追踪万米高空的飞机&#xf…

作者头像 李华
网站建设 2026/2/7 20:05:01

CogVideoX-2b效果展示:多场景下连贯动态视频生成实录

CogVideoX-2b效果展示:多场景下连贯动态视频生成实录 1. 这不是“又一个文生视频工具”,而是能真正跑起来的本地导演 你有没有试过在本地部署一个文生视频模型,结果卡在环境配置、显存溢出、依赖冲突上,折腾半天连第一帧都没渲染…

作者头像 李华
网站建设 2026/2/8 8:12:05

Open-AutoGLM ADB连接不稳定?试试这个方法

Open-AutoGLM ADB连接不稳定?试试这个方法 在使用Open-AutoGLM进行手机自动化操作时,你是否也遇到过这样的情况:命令刚执行到一半,ADB突然断开连接,屏幕截图失败,操作卡在半途;或者WiFi远程调试…

作者头像 李华