小白也能懂的开机自启动:测试脚本保姆级教程
1. 为什么你需要这个教程
你是不是遇到过这样的情况:写好了一个监控脚本、一个数据采集程序,或者一个简单的自动化任务,每次重启电脑后都要手动点开终端、cd到目录、再敲一遍bash xxx.sh?太麻烦了,对吧?
更糟的是,网上搜“Ubuntu开机自启动”,出来的方案五花八门:有的要改rc.local,有的说用crontab @reboot,还有的让你去编辑.bashrc……结果试来试去,要么根本没反应,要么只在你登录后才运行,要么一重启就报错。
别折腾了。这篇教程就是为你写的——不讲原理套话,不堆专业术语,从新建一个文件开始,到看到日志里出现那行字为止,全程手把手,连路径怎么复制、命令怎么粘贴、哪里容易出错都标得清清楚楚。哪怕你第一次打开终端,也能照着做完。
它不依赖图形界面,不挑用户登录状态,不靠网络就绪,只要系统一通电、内核一加载、服务一就位,你的脚本就稳稳跑起来。而且,它用的是Ubuntu官方推荐的标准方式:systemd服务。安全、稳定、可管理,以后想停掉、查状态、看日志,一条命令全搞定。
2. 先搞懂三件事:它到底怎么工作的
2.1 它不是“开机时自动双击”
很多人下意识觉得“开机自启动”就是像Windows那样,等桌面出来后自动点开一个程序。Linux不是这样。真正的开机自启动,是在系统底层服务启动阶段,由系统本身主动拉起你的任务。它比你登录还早,甚至可能在你还没输密码前就已经在后台跑着了。
2.2 它靠一个叫“.service”的小文件指挥
你不需要动系统核心配置,也不用改任何系统文件。你只需要写一个纯文本文件,名字叫AutoRun.service,里面用几行简单英语告诉系统:“我要跑什么脚本”“以谁的身份跑”“等哪些条件满足后再跑”。系统读到这个文件,就把它当成一个正规服务来对待。
2.3 它有两个关键动作:启用 + 启动
systemctl enable:意思是“记住它,下次开机一定要拉它”。这一步只是登记,不立刻执行。systemctl start:意思是“现在就跑一次”。这一步帮你立刻验证脚本是否真能工作,不用等重启。
这两步分开做,既安全又可控。你随时可以stop、status、restart,就像管理一个正规软件一样。
3. 准备工作:创建测试脚本 test.sh
我们先做一个最简单的脚本,用来验证整个流程是否成功。它的作用只有一个:每次运行时,在桌面上生成或追加一行文字到test.log文件里。
3.1 打开终端,进入桌面目录
请按顺序输入以下命令(每输完一行按回车):
cd ~/Desktop这条命令把你带到桌面文件夹。注意,~代表你自己的用户主目录,/Desktop是标准路径,不用改成/home/xxx/Desktop,直接用~/Desktop最稳妥。
3.2 创建 test.sh 文件并写入内容
输入以下命令创建文件:
nano test.sh这时会进入一个文本编辑器界面。把下面这四行原样复制粘贴进去(注意:不要复制本行文字,只复制代码块里的内容):
#!/bin/bash # 这是一个开机自启动的测试程序。 echo "【$(date '+%Y-%m-%d %H:%M:%S')】开机自启动脚本已成功运行!" >> test.log exit 0说明一下这几行的意思:
- 第一行
#!/bin/bash是必须的,告诉系统“用bash来执行这个文件”; - 第二行是注释,系统会忽略,但对你自己有提醒作用;
- 第三行是核心:
echo输出一段带时间戳的文字,并用>>追加到test.log文件末尾; - 第四行
exit 0表示“正常结束”,让系统知道这次执行没问题。
粘贴完成后,按键盘组合键Ctrl+O(字母O,不是零),回车确认保存;再按Ctrl+X退出编辑器。
3.3 给脚本添加可执行权限
刚创建的文件默认不能直接运行,需要授权:
chmod +x test.sh这条命令的意思是“给test.sh加上‘可以被执行’的权限”。没有它,后面所有启动都会失败。
3.4 手动运行一次,确认脚本能工作
现在我们来测试一下脚本本身有没有问题:
./test.sh如果一切正常,终端不会报错,也不会输出任何文字(因为输出被重定向到日志了)。接着输入:
cat test.log你应该能看到类似这样的内容:
【2024-06-15 14:22:38】开机自启动脚本已成功运行!恭喜!你的测试脚本已经准备就绪。记住,这一步必须成功,否则后面的服务配置一定失败。
4. 核心步骤:编写并安装 AutoRun.service 服务文件
4.1 创建服务文件
回到桌面目录(如果刚才退出了终端,先执行cd ~/Desktop):
nano AutoRun.service把下面这段内容完整复制粘贴进去(注意:路径全部使用绝对路径,且与你当前环境一致):
[Unit] Description=开机自启动测试服务 After=multi-user.target [Service] Type=simple User=$USER WorkingDirectory=/home/$USER/Desktop ExecStart=/home/$USER/Desktop/test.sh Restart=on-failure RestartSec=10 [Install] WantedBy=multi-user.target重点说明几个关键项:
User=$USER:自动替换成你当前登录的用户名,避免硬编码root带来的权限风险;WorkingDirectory和ExecStart都用了$USER变量,确保路径通用;Restart=on-failure:万一脚本意外退出,系统会在10秒后自动重试,增强健壮性;After=multi-user.target:表示等基础系统服务(如网络、文件系统)就绪后再启动,比network.target更稳妥。
粘贴完毕后,同样按Ctrl+O回车保存,Ctrl+X退出。
4.2 把服务文件放到系统服务目录
系统只认/etc/systemd/system/目录下的.service文件。我们需要用管理员权限复制过去:
sudo cp AutoRun.service /etc/systemd/system/输入密码(输的时候看不到字符,这是正常现象),回车确认。
4.3 重新加载服务配置并启用开机启动
现在系统还不知道这个新服务的存在,需要刷新缓存:
sudo systemctl daemon-reload然后告诉系统:“下次开机,请务必启动它”:
sudo systemctl enable AutoRun.service你会看到提示:Created symlink ...,说明登记成功。
4.4 立即启动一次,验证服务是否生效
别等重启,现在就试:
sudo systemctl start AutoRun.service再检查日志是否新增了一行:
cat test.log你应该能看到两条记录,第二条的时间是刚刚执行的时刻。 服务已正确运行。
5. 实用技巧与常见问题排查
5.1 怎么确认服务状态?三条命令就够了
- 查看是否正在运行:
sudo systemctl status AutoRun.service
(绿色“active (running)”表示成功) - 查看最近日志:
sudo journalctl -u AutoRun.service -n 20 --no-pager
(显示最后20行日志,帮你定位错误) - 停止服务(调试时常用):
sudo systemctl stop AutoRun.service
5.2 脚本不执行?先看这三点
| 现象 | 最可能原因 | 解决方法 |
|---|---|---|
systemctl status显示failed | ExecStart路径写错,或脚本无执行权限 | 用ls -l /home/$USER/Desktop/test.sh确认有x权限;用file /home/$USER/Desktop/test.sh确认是文本文件 |
日志里没新增内容,但状态显示active | WorkingDirectory或ExecStart路径中用了相对路径(如./test.sh) | 必须全部用绝对路径,如/home/xxx/Desktop/test.sh |
重启后没运行,但手动start可以 | 忘了enable,或WantedBy写错了 | 重新执行sudo systemctl enable AutoRun.service;检查[Install]段是否为WantedBy=multi-user.target |
5.3 想改脚本内容?不用重装服务
你随时可以修改test.sh,比如加一行echo "额外任务",保存后,只需执行:
sudo systemctl restart AutoRun.service服务会立即停止旧进程、拉起新脚本,无需重新enable或daemon-reload。
5.4 卸载服务:两步彻底清除
如果某天你想完全移除它:
sudo systemctl disable AutoRun.service sudo rm /etc/systemd/system/AutoRun.service sudo systemctl daemon-reload6. 进阶建议:让自启动更可靠、更实用
6.1 加个日志轮转,避免日志文件无限膨胀
在test.sh开头加两行:
# 自动清理超过7天的日志 find /home/$USER/Desktop/test.log -mtime +7 -delete 2>/dev/null # 如果日志大于1MB,重命名备份 if [ -f "/home/$USER/Desktop/test.log" ] && [ $(stat -c%s "/home/$USER/Desktop/test.log" 2>/dev/null) -gt 1048576 ]; then mv "/home/$USER/Desktop/test.log" "/home/$USER/Desktop/test_$(date +%Y%m%d_%H%M%S).log" fi6.2 让脚本支持“启动/停止/重启”参数(兼容老习惯)
修改test.sh的ExecStart行为,让它能响应不同指令:
#!/bin/bash case "$1" in start) echo "【$(date '+%Y-%m-%d %H:%M:%S')】服务已启动" >> test.log ;; stop) echo "【$(date '+%Y-%m-%d %H:%M:%S')】服务已停止" >> test.log ;; *) echo "Usage: $0 {start|stop}" >&2 exit 1 ;; esac exit 0对应地,AutoRun.service中的ExecStart改为:
ExecStart=/home/$USER/Desktop/test.sh start6.3 多个脚本?一个服务管多个
不需要为每个脚本建一个service。在test.sh里用循环调用:
for script in /home/$USER/Desktop/scripts/*.sh; do if [ -x "$script" ]; then "$script" fi done然后把所有待启动的脚本放在~/Desktop/scripts/目录下,统一管理。
7. 总结:你已经掌握的不只是一个技巧
你刚刚完成的,不是一个简单的“开机跑脚本”操作,而是掌握了Linux系统服务管理的核心逻辑:用声明式配置代替手动干预,用标准化接口替代零散技巧。这套方法适用于99%的后台任务——无论是定时采集传感器数据、自动备份重要文件、还是启动一个轻量Web服务。
更重要的是,你学会了如何验证每一步:从脚本权限、路径正确性,到服务状态、日志输出。这种“分段验证、逐层推进”的工程思维,比记住某条命令重要得多。
现在,你可以放心重启电脑了。等它再次亮起,打开桌面,双击test.log,看到那行带时间戳的记录,你就知道:你亲手部署的第一个系统级自动化服务,已经稳稳扎根在你的机器里。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。