news 2026/4/16 12:33:06

如何让脚本开机自动运行?测试启动脚本实战教学

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何让脚本开机自动运行?测试启动脚本实战教学

如何让脚本开机自动运行?测试启动脚本实战教学

你是不是也遇到过这样的问题:写好了一个监控脚本、数据采集脚本,或者一个自动备份的小工具,每次重启系统后都要手动点开终端再执行一遍?太麻烦了。其实,Linux系统早就为我们准备好了多种可靠的开机自启方案——关键不是“能不能”,而是“选哪一种更稳、更干净、更适合你的场景”。

本文不讲抽象理论,不堆砌命令参数,就用一个真实可运行的测试脚本(test.sh)带你从零实操三种主流开机自启方法:/etc/init.d服务式管理、GNOME桌面级自启、rc.local系统级兜底方案。每一步都配完整命令、注意事项和避坑提示,连新手也能照着操作成功。

我们用的镜像名称是「测试开机启动脚本」,它已预装 Ubuntu 环境和基础工具,无需额外配置系统版本或依赖。所有操作均在标准桌面版 Ubuntu(20.04/22.04)验证通过,不依赖 systemd 用户会话、不修改内核、不涉及容器或云平台,纯粹聚焦于本地脚本的可靠启动。

1. 先准备好测试脚本:确保它真的能跑

在开始任何自启配置前,请务必确认你的脚本本身没有路径、权限或环境问题。很多“自启失败”其实根本不是启动机制的问题,而是脚本卡在第一步。

我们用这个简洁但信息完整的测试脚本:

#!/bin/bash # test.sh —— 用于验证开机自启是否生效 cd /home/$USER/Desktop/ 2>/dev/null || echo " 警告:Desktop 目录不存在,尝试切换到 /tmp" ls -la | head -n 5 echo " 脚本执行完成,当前时间:$(date '+%H:%M:%S')" logger "test.sh executed at $(date)" exit 0

为什么这样写?

  • 使用$USER替代硬编码用户名,适配任意用户;
  • 2>/dev/null避免因路径不存在导致脚本中断;
  • logger命令将执行记录写入系统日志(journalctl -u systemd --since "1 hour ago"可查),比单纯echo更可靠;
  • head -n 5控制输出长度,避免日志刷屏。

保存并赋予执行权限:

nano ~/Desktop/test.sh chmod +x ~/Desktop/test.sh

手动运行一次验证:

~/Desktop/test.sh

你应该看到类似输出:

total 8 drwxr-xr-x 2 user user 4096 May 20 10:30 . drwxr-xr-x 3 user user 4096 May 20 10:29 .. -rwxr-xr-x 1 user user 248 May 20 10:30 test.sh 脚本执行完成,当前时间:10:30:45

如果这一步失败,请先解决脚本本身问题(路径、权限、语法),再继续后续配置。

2. 方法一:/etc/init.d 服务化管理(推荐用于长期后台任务)

这是最“正统”的 Linux 启动方式,把你的脚本注册为系统服务,支持start/stop/restart/status操作,适合需要稳定运行、可被系统统一管理的脚本(如日志轮转、网络监听、定时采集等)。

2.1 将脚本复制到系统服务目录

sudo cp ~/Desktop/test.sh /etc/init.d/test-startup sudo chmod +x /etc/init.d/test-startup

注意:文件名必须不含.sh后缀(update-rc.d会识别失败),且建议全小写、无空格、无特殊字符。

2.2 添加 LSB 标头(关键!否则 update-rc.d 会报错)

编辑/etc/init.d/test-startup,在#!/bin/bash下方插入标准 LSB(Linux Standard Base)注释块:

#!/bin/bash ### BEGIN INIT INFO # Provides: test-startup # Required-Start: $local_fs $network $named $time $syslog # Required-Stop: $local_fs $network $named $time $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Description: Test script for auto-start on boot # Short-Description: test-startup ### END INIT INFO # 后续保持原有脚本内容不变... cd /home/$USER/Desktop/ 2>/dev/null || echo " 警告:Desktop 目录不存在..." ls -la | head -n 5 echo " 脚本执行完成,当前时间:$(date '+%H:%M:%S')" logger "test-startup executed at $(date)" exit 0

LSB 标头作用:告诉系统该服务依赖哪些基础资源(如网络、文件系统),以及应在哪些运行级别(runlevel)启动/停止。Default-Start: 2 3 4 5表示在多用户图形/文本模式下都启用。

2.3 注册为开机服务

sudo update-rc.d test-startup defaults

输出类似:

Adding system startup for /etc/init.d/test-startup ... /etc/rc0.d/K20test-startup -> ../init.d/test-startup /etc/rc1.d/K20test-startup -> ../init.d/test-startup /etc/rc6.d/K20test-startup -> ../init.d/test-startup /etc/rc2.d/S20test-startup -> ../init.d/test-startup /etc/rc3.d/S20test-startup -> ../init.d/test-startup /etc/rc4.d/S20test-startup -> ../init.d/test-startup /etc/rc5.d/S20test-startup -> ../init.d/test-startup

解读:S20表示“Start at priority 20”,数字越小越早启动;K20表示“Kill at priority 20”,关机时按此顺序停止。默认优先级为 20,足够满足大多数脚本需求。

2.4 验证与调试

  • 立即启动服务(不重启):

    sudo service test-startup start
  • 查看状态:

    sudo service test-startup status
  • 检查日志(最可靠):

    journalctl -u test-startup --since "1 minute ago" -n 20 # 或全局搜索 logger 记录 journalctl --since "1 minute ago" | grep "test-startup"
  • 移除服务(如需重试):

    sudo update-rc.d -f test-startup remove sudo rm /etc/init.d/test-startup

优势:系统级管理、支持依赖控制、可手动启停、日志统一;
注意:Ubuntu 桌面版默认使用systemd/etc/init.d是兼容层,对纯 GUI 应用(如打开窗口)支持有限。

3. 方法二:GNOME 桌面自启(推荐用于图形界面程序)

如果你的脚本最终要打开终端、弹出通知、启动 GUI 工具(比如gpartedgedit),或者只是想在登录桌面后自动运行——那么/etc/init.d可能“太早”了:它在用户登录前就执行,此时$DISPLAY环境变量未设置,GUI 无法显示。

这时,用 GNOME 自带的「启动应用程序」是最轻量、最直观的选择。

3.1 启动 GNOME 启动管理器

打开终端,输入:

gnome-session-properties

这会弹出图形化窗口:「启动应用程序首选项」。

3.2 添加新启动项

点击左上角「添加」按钮,填写三项:

  • 名称Test Startup Script
  • 命令gnome-terminal -- bash -c "/home/$USER/Desktop/test.sh; exec bash"
  • 注释运行开机测试脚本并保持终端打开

关键说明:

  • gnome-terminal -- bash -c "...":显式调用终端执行命令;
  • exec bash:让终端执行完脚本后不立即关闭,方便你看到输出结果;
  • 不要用~符号,$USER更可靠;
  • 如果只需后台静默运行(不弹窗),命令改为:/home/$USER/Desktop/test.sh > /tmp/test.log 2>&1 &

3.3 验证与优化

  • 点击「添加」→「关闭」→ 注销并重新登录(或重启)。
  • 登录后,你会看到一个终端窗口自动弹出,执行脚本并停留。
  • 查看/tmp/test.log(若用了重定向)或直接观察终端输出。

优势:简单直观、GUI 友好、用户级隔离、不影响其他用户;
注意:仅对 GNOME(及部分兼容桌面)有效;若使用 KDE、XFCE 等,需对应桌面环境的自启配置(如~/.config/autostart/)。

4. 方法三:rc.local 兜底方案(推荐用于快速验证或嵌入式场景)

/etc/rc.local是一个传统但极其稳定的“万能钩子”:它在绝大多数初始化流程完成后、用户登录前执行,且保证以 root 权限运行。适合需要访问硬件设备、挂载磁盘、设置内核参数等底层操作的脚本。

重要前提:Ubuntu 20.04+ 默认禁用rc.local,需手动启用。

4.1 启用 rc.local 服务

sudo nano /etc/rc.local

填入以下内容(注意保留#!/bin/sh -eexit 0):

#!/bin/sh -e # # rc.local # # This script is executed at the end of each multiuser runlevel. # Make sure that the script will exit 0 on success or any other # value on error. # # In order to enable or disable this script, simply change the execution # bits. # # By default this script does nothing. # 👇 在这里添加你的命令(注意:路径必须绝对,不能用 ~) cd /home/$USER/Desktop/ && ./test.sh >> /var/log/test-startup.log 2>&1 exit 0

为什么用>> /var/log/...
因为rc.local运行时无终端,所有echo输出都会丢失,必须重定向到文件才能查看。

4.2 赋予可执行权限并启用服务

sudo chmod +x /etc/rc.local sudo systemctl enable rc-local sudo systemctl start rc-local

4.3 检查是否生效

sudo systemctl status rc-local # 查看日志 sudo tail -n 20 /var/log/test-startup.log

优势:兼容性极强(几乎所有 Linux 发行版都支持)、执行时机晚、权限高;
注意:rc.local$USER不可用(尚未登录),必须用绝对路径(如/home/yourname/Desktop/);若脚本依赖 GUI 环境(如DISPLAY),此方法会失败。

5. 三种方法对比与选型建议

面对不同需求,如何选择最合适的方式?下面这张表帮你一眼看清核心差异:

维度/etc/init.d(服务化)GNOME 桌面自启rc.local(系统级)
适用场景后台守护进程、系统级任务(监控、采集、服务)图形界面程序、用户级工具(终端、通知、GUI 应用)底层初始化、硬件配置、快速验证
执行时机多用户模式启动时(早于登录)用户登录桌面后(GUI 环境就绪)所有服务启动后、登录前(最晚系统级)
执行权限root(可降权)当前用户root
GUI 支持❌ 不支持(无$DISPLAY完全支持❌ 不支持(无$DISPLAY
调试难度中(需查journalctl低(终端可见)中(需查日志文件)
跨桌面兼容性所有 Linux❌ 仅 GNOME/GTK 环境所有 Linux
推荐指数☆(长期项目首选)(桌面用户首选)(临时验证/嵌入式首选)

一句话选型口诀

  • 要“一直跑、没人管” → 选/etc/init.d
  • 要“一登录、就弹窗” → 选 GNOME 自启;
  • 要“刚开机、就干活”(且不依赖 GUI)→ 选rc.local

6. 常见问题与终极排错指南

即使严格按步骤操作,仍可能遇到“脚本没执行”“执行了但没效果”等问题。别急,以下是高频问题的定位路径:

6.1 第一步:确认脚本本身能否独立运行

# 切换到 root 用户模拟 init.d 环境 sudo su - cd /home/yourname/Desktop/ ./test.sh # 若报错“Permission denied”,说明权限不足 → chmod +x # 若报错“No such file”,说明路径错误 → 用绝对路径

6.2 第二步:检查执行环境差异

  • /etc/init.drc.local中:

    • $HOME$USER~不可用 → 必须用/home/username/
    • $PATH极简(通常只有/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin)→ 用绝对路径调用命令(如/bin/ls);
    • $DISPLAY→ GUI 命令(gedit,notify-send)会失败。
  • GNOME 自启中:

    • $DISPLAY$XAUTHORITY已设置 → GUI 正常;
    • $PATH可能不包含~/bin→ 推荐用绝对路径。

6.3 第三步:查日志,别猜

方法日志位置查看命令
/etc/init.dsystemd journalsudo journalctl -u test-startup --since "1 hour ago"
GNOME 自启用户 session 日志journalctl --user --since "1 hour ago" | grep test
rc.local/var/log/syslog或自定义日志sudo grep "test-startup" /var/log/syslogsudo tail -n 50 /var/log/test-startup.log

6.4 终极验证法:加一行“我在运行”

在脚本开头加入:

echo "$(date): test.sh STARTED" >> /tmp/startup-debug.log

重启后检查/tmp/startup-debug.log是否有时间戳。有 → 说明已触发;无 → 说明启动机制未生效。


获取更多AI镜像

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

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

小白也能懂的语音克隆:用CosyVoice2-0.5B快速实现3秒复刻

小白也能懂的语音克隆:用CosyVoice2-0.5B快速实现3秒复刻 1. 为什么你不需要再为配音发愁了? 你有没有过这些时刻: 做短视频时,反复录十遍都录不出想要的情绪,最后只能放弃配音;给客户做产品演示&#x…

作者头像 李华
网站建设 2026/4/16 12:33:38

FSMN VAD模型加载失败?路径配置与权限问题排查指南

FSMN VAD模型加载失败?路径配置与权限问题排查指南 1. 为什么FSMN VAD模型总在启动时“卡住”? 你兴冲冲地执行了 /bin/bash /root/run.sh,浏览器打开 http://localhost:7860,却只看到一片空白,或者页面报错“Model …

作者头像 李华
网站建设 2026/4/15 8:27:36

1小时搭建MOFOS数据转换器原型

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个MOFOS到CSV转换器原型,要求:1.支持文件上传 2.自动识别MOFOS结构 3.可配置的转换规则 4.实时预览转换结果 5.一键导出CSV。使用Python处理转换逻辑…

作者头像 李华
网站建设 2026/4/16 12:43:42

Cursor Rules快速原型:5分钟构建你的第一个AI代码工具

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个快速原型工具,基于Cursor Rules快速生成代码工具原型。功能包括:1. 输入简单描述,自动生成工具的基本框架;2. 提供可自定义…

作者头像 李华
网站建设 2026/4/15 23:29:44

Open-AutoGLM会议提醒助手:日程同步执行代理部署案例

Open-AutoGLM会议提醒助手:日程同步执行代理部署案例 你有没有过这样的经历:开会前五分钟才想起没设置提醒,手忙脚乱翻日历、点通知、切App,结果还是迟到了?或者明明在日历里写了“下午3点项目复盘”,却因…

作者头像 李华
网站建设 2026/4/16 12:36:19

踩过这些坑才懂:SGLang使用中的那些陷阱

踩过这些坑才懂:SGLang使用中的那些陷阱 SGLang-v0.5.6镜像作为当前主流的结构化大模型推理框架,凭借RadixAttention缓存复用、正则约束解码和DSL编程抽象等特性,确实在吞吐量和易用性上带来了显著提升。但真实工程落地远非文档里几行命令那…

作者头像 李华