news 2026/4/21 17:27:11

如何让.sh脚本开机自动运行?这份教程请收好

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
如何让.sh脚本开机自动运行?这份教程请收好

如何让.sh脚本开机自动运行?这份教程请收好

你是不是也遇到过这样的问题:写好了自动化任务脚本,每次重启后还得手动执行一遍?明明只需要让它“悄悄开工”就行,却卡在了开机自启这一步。别急,这篇教程就是为你准备的——不讲虚的,不堆术语,从创建脚本到验证结果,每一步都贴着实际操作走,连权限怎么设、文件在哪改、重启后怎么看效果,全都给你列清楚。

本文基于常见的Linux发行版(如Ubuntu 20.04/22.04等)环境编写,适用于大多数桌面或服务器场景。无论你是刚接触Linux的新手,还是想快速解决一个具体问题的开发者,都能照着做、马上用、一次成功。

1. 先写一个能跑起来的.sh脚本

脚本能不能自动运行,前提是它自己得先能手动跑通。所以第一步不是去改系统配置,而是把你要做的事,用最简单的方式写成一个可执行的shell文件。

1.1 创建脚本文件

推荐放在你自己的用户目录下,比如:

mkdir -p ~/scripts nano ~/scripts/auto_start_demo.sh

这里用nano编辑器(比vim更友好),你也可以用vimgedit,看习惯。文件名随意,但建议用英文+下划线,避免空格和中文。

1.2 写入脚本内容

把下面这段代码完整复制进去(注意:第一行必须是#!/bin/bash,一个字母都不能错):

#!/bin/bash # 记录启动时间,方便验证是否真的执行了 echo "Script started at $(date)" >> ~/startup_log.txt # 进入某个目录(示例:假设你有个项目在~/myproject) cd /home/$USER/myproject 2>/dev/null || echo "Directory not found, skipping cd" # 执行你想做的操作,比如启动一个程序、生成一个文件、发送通知等 echo "Hello from auto-start script!" > ~/hello_from_boot.txt # 可选:打印一句提示(只在终端手动运行时可见,开机自启时看不到) echo " Auto-start script completed"

小贴士:

  • $(date)会自动插入当前时间,这样你一看startup_log.txt就知道是哪次启动触发的;
  • 2>/dev/null意思是“把错误信息藏起来”,避免路径不存在时报错打断流程;
  • >>是追加写入,>是覆盖写入,日志类建议用>>
  • $USER会自动替换成你的用户名,比硬写/home/yourname更通用。

1.3 保存并测试脚本

Ctrl+O→ 回车(保存),再按Ctrl+X(退出nano)。
然后给它加上执行权限:

chmod +x ~/scripts/auto_start_demo.sh

现在手动运行试试:

~/scripts/auto_start_demo.sh

检查一下有没有生成~/hello_from_boot.txt~/startup_log.txt,内容对不对。如果没问题,说明脚本本身完全OK——这是后续所有步骤的基础。

2. 选择最适合你系统的自启方式

Linux没有统一的“开机自启标准”,不同版本、不同桌面环境,支持的方法不一样。我们不搞一刀切,而是分情况说明,你对照自己系统选一个就行。

2.1 方法一:通过systemd服务(推荐 · Ubuntu 16.04+ / Debian 8+)

这是目前最主流、最稳定、最可控的方式,尤其适合服务器或无图形界面的环境。它能精确控制启动时机、失败重试、日志查看,还不会被桌面环境干扰。

创建服务文件
sudo nano /etc/systemd/system/auto-start-script.service

粘贴以下内容(注意替换YourUserName为你真实的用户名):

[Unit] Description=Run my auto-start script at boot After=multi-user.target [Service] Type=oneshot User=YourUserName ExecStart=/home/YourUserName/scripts/auto_start_demo.sh RemainAfterExit=yes [Install] WantedBy=multi-user.target

关键点说明:

  • User=YourUserName:必须填你自己的用户名,不能写root(除非你真要以root身份运行);
  • Type=oneshot:表示这个服务只运行一次,适合脚本;
  • RemainAfterExit=yes:让systemd认为服务“还在运行”,方便状态查询;
  • After=multi-user.target:确保网络、文件系统等基础服务就绪后再执行。
启用并测试服务
# 重新加载配置 sudo systemctl daemon-reload # 启用开机自启 sudo systemctl enable auto-start-script.service # 立即运行一次(不用重启) sudo systemctl start auto-start-script.service # 查看运行状态和日志 sudo systemctl status auto-start-script.service sudo journalctl -u auto-start-script.service -n 20 --no-pager

如果看到active (exited)和你脚本里写的日志,说明已就位。下次重启就会自动触发。

2.2 方法二:通过/etc/rc.local(传统方式 · 适用于老版本或精简系统)

有些旧版Ubuntu(如16.04)默认保留了rc.local,但新版(18.04+)默认不启用。如果你确认系统里有/etc/rc.local且能编辑,可以用这个方法——它简单直接,适合快速验证。

检查rc.local是否存在且可用
ls -l /etc/rc.local

如果显示No such file or directory,跳过本节;如果存在但权限是-rwxr-xr-x,说明已启用,直接编辑;如果是-rw-r--r--,需要先加执行权限:

sudo chmod +x /etc/rc.local
编辑rc.local
sudo nano /etc/rc.local

exit 0这一行之前,添加你的脚本调用命令:

# 在 exit 0 前插入这一行 su -c "/home/YourUserName/scripts/auto_start_demo.sh" -s /bin/sh YourUserName

完整的/etc/rc.local应该长这样(省略注释):

#!/bin/sh -e # # rc.local # # 自定义启动脚本 su -c "/home/YourUserName/scripts/auto_start_demo.sh" -s /bin/sh YourUserName exit 0

注意:

  • 必须用su -c切换到普通用户执行,避免脚本以root身份运行导致权限混乱;
  • exit 0必须保留,且必须在最后一行,否则系统可能卡在启动过程。
验证rc.local是否生效
sudo /etc/rc.local

运行后检查~/startup_log.txt是否新增了一条记录。如果有,说明配置正确。

2.3 方法三:通过用户级启动(桌面环境专用 · GNOME/KDE/XFCE)

如果你用的是带图形界面的Ubuntu、Linux Mint等,且脚本只需在你登录桌面后运行(比如启动一个托盘程序、挂载网盘),那用“启动应用程序”最安全、最轻量。

图形界面操作(GNOME为例)
  1. 打开“设置” → “开机启动”(或搜索“Startup Applications”)
  2. 点击“添加”
  3. 名称填My Auto Script,命令填:
    /home/YourUserName/scripts/auto_start_demo.sh
  4. 点击“添加”

完事。下次你输入密码登录桌面时,脚本就会自动跑起来。

优势:无需sudo权限,不影响系统其他用户,出问题也不会拖慢整个启动流程。

3. 验证是否真的成功了

光改完配置不算完,一定要亲眼看到效果才算落地。这里提供几个简单可靠的验证方法。

3.1 检查日志文件(最直接)

前面脚本里写了:

echo "Script started at $(date)" >> ~/startup_log.txt

重启后,打开终端,输入:

cat ~/startup_log.txt

如果看到类似这样的内容:

Script started at Mon Jun 10 09:23:45 CST 2024 Script started at Mon Jun 10 09:41:12 CST 2024

说明脚本确实在两次启动时都执行了。时间戳就是铁证。

3.2 检查输出文件是否存在

脚本里还生成了:

echo "Hello from auto-start script!" > ~/hello_from_boot.txt

重启后,直接看文件:

ls -l ~/hello_from_boot.txt cat ~/hello_from_boot.txt

如果文件存在且内容正确,100%成功。

3.3 查看systemd服务状态(仅限方法一)

systemctl status auto-start-script.service

重点关注两行:

  • Active:后面是active (exited)表示成功运行过;
  • Loaded:后面是enabled表示已设置为开机自启。

如果显示failed,用下面命令看详细错误:

journalctl -u auto-start-script.service --since "1 hour ago" --no-pager

常见错误:路径写错、权限不够、用户没填对——日志里基本都写明了。

4. 常见问题与避坑指南

实际操作中,90%的问题都出在细节上。这里把大家踩过的坑集中列出来,帮你绕开。

4.1 脚本执行了,但文件没生成?可能是路径问题

  • ❌ 错误写法:cd ~/myproject——~在systemd或rc.local里不展开,会被当成字面量;
  • 正确写法:cd /home/YourUserName/myprojectcd $HOME/myproject$HOME在多数环境下可识别)。

4.2 提示“Permission denied”?

  • 检查脚本权限:ls -l ~/scripts/auto_start_demo.sh,必须有x(执行)标志;
  • 如果用systemd,确认User=字段填的是你自己的用户名,不是root
  • 如果用rc.local,确认su -c命令里的用户名拼写完全一致。

4.3 脚本里调用了GUI程序(比如geditfirefox)不弹窗?

  • systemd服务默认没有图形会话环境,GUI程序无法显示;
  • 解决方案:改用“用户级启动”(方法三),或者在systemd服务里显式指定环境变量:
[Service] Environment="DISPLAY=:0" Environment="XAUTHORITY=/home/YourUserName/.Xauthority"

但强烈建议:GUI类任务优先走桌面启动项,更稳妥。

4.4 重启后发现系统变慢,或卡在紫色屏幕?

  • 很可能是rc.local里某条命令卡住没返回(比如ping -c 4 google.com但网络不通);
  • 解决办法:在rc.local里所有外部命令后加超时,例如:
    timeout 10s /home/YourUserName/scripts/auto_start_demo.sh || true

5. 总结:选对方法,一次搞定

到这里,你应该已经掌握了让.sh脚本开机自动运行的全部核心方法。我们来快速回顾一下关键决策点:

  • 如果你用的是较新Ubuntu(18.04+)、Debian或服务器环境 → 选systemd服务:最规范、最可靠、日志最全;
  • 如果你确认/etc/rc.local存在且能编辑 → 用rc.local:最快上手,适合临时验证或老系统;
  • 如果你只是想登录桌面后自动运行 → 用“开机启动应用程序”:最安全,零风险,图形程序首选。

无论选哪种,记住三个铁律:
1⃣ 脚本先手动跑通;
2⃣ 路径写绝对路径,别依赖~
3⃣ 每次修改后,用日志或输出文件验证,别猜。

现在,关掉这篇教程,打开你的终端,花3分钟试一遍。你会发现,所谓“开机自启”,根本不是什么黑科技,而是一套清晰、可复现、人人能掌握的常规操作。


获取更多AI镜像

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

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

Unity3D MOBA 手游技能系统设计全解析(大白话版,带 C# 代码落地)

做 MOBA 的技能系统,说白了就是:玩家按一下键,你得在极短时间里把“能不能放、往哪放、打到谁、怎么算伤害、播什么表现、能不能打断、CD 怎么走”一口气安排明白,而且还要做到——策划天天改你也不崩,团战一开帧率别跪,联网对战别出现“我这边躲开了他那边还打中了”的玄…

作者头像 李华
网站建设 2026/4/18 11:45:42

小白福音!Z-Image-Turbo本地部署只需3步

小白福音!Z-Image-Turbo本地部署只需3步 你是不是也经历过这些时刻? 打开一个AI绘图工具,光是看文档就花了半小时; 复制粘贴一堆命令,结果报错信息满屏飞; 好不容易跑起来,界面还卡在“Loading…

作者头像 李华
网站建设 2026/4/21 8:11:44

终极指南:SMUDebugTool完全掌握PCIe与内存性能优化技术

终极指南:SMUDebugTool完全掌握PCIe与内存性能优化技术 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://g…

作者头像 李华
网站建设 2026/4/18 0:12:31

Vue文档编辑器(Word默认功能)示例

Spire.WordJS 基于 HTML5 标准,支持跨平台开发和集成,支持所有主流浏览器,无需安装任何插件或第三方组件,以原生的方式嵌入各类应用,可以与各类前端技术框架Vue、React、Angular 等相结合。 Spire.WordJS以纯前端、跨平…

作者头像 李华
网站建设 2026/4/18 2:10:20

PyTorch-2.x镜像测评:常用库预装到底有多方便?

PyTorch-2.x镜像测评:常用库预装到底有多方便? 1. 为什么一个“开箱即用”的PyTorch环境值得专门测评? 你有没有过这样的经历: 刚配好CUDA,pip install torch 却报错说找不到匹配的cu118版本; 好不容易装…

作者头像 李华