如何让.sh脚本开机自动运行?这份教程请收好
你是不是也遇到过这样的问题:写好了自动化任务脚本,每次重启后还得手动执行一遍?明明只需要让它“悄悄开工”就行,却卡在了开机自启这一步。别急,这篇教程就是为你准备的——不讲虚的,不堆术语,从创建脚本到验证结果,每一步都贴着实际操作走,连权限怎么设、文件在哪改、重启后怎么看效果,全都给你列清楚。
本文基于常见的Linux发行版(如Ubuntu 20.04/22.04等)环境编写,适用于大多数桌面或服务器场景。无论你是刚接触Linux的新手,还是想快速解决一个具体问题的开发者,都能照着做、马上用、一次成功。
1. 先写一个能跑起来的.sh脚本
脚本能不能自动运行,前提是它自己得先能手动跑通。所以第一步不是去改系统配置,而是把你要做的事,用最简单的方式写成一个可执行的shell文件。
1.1 创建脚本文件
推荐放在你自己的用户目录下,比如:
mkdir -p ~/scripts nano ~/scripts/auto_start_demo.sh这里用nano编辑器(比vim更友好),你也可以用vim或gedit,看习惯。文件名随意,但建议用英文+下划线,避免空格和中文。
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为例)
- 打开“设置” → “开机启动”(或搜索“Startup Applications”)
- 点击“添加”
- 名称填
My Auto Script,命令填:/home/YourUserName/scripts/auto_start_demo.sh - 点击“添加”
完事。下次你输入密码登录桌面时,脚本就会自动跑起来。
优势:无需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/myproject或cd $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程序(比如gedit、firefox)不弹窗?
- 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星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。