超详细图解:Ubuntu开机启动脚本配置全流程
在实际开发和运维过程中,我们常常需要让某些程序或脚本在系统启动时自动运行。比如部署服务、启动监控脚本、挂载资源等场景,手动每次输入命令显然不现实。本文将带你从零开始,手把手完成 Ubuntu 系统下开机启动脚本的完整配置流程,涵盖环境准备、脚本编写、权限设置、注册启动项、验证与调试等所有关键步骤。
无论你是刚接触 Linux 的新手,还是想巩固系统管理技能的开发者,这篇文章都能让你一次搞懂、一次配通、一次落地。
1. 开机启动的核心机制解析
在深入操作前,先简单了解 Ubuntu 是如何执行开机脚本的,有助于我们选择合适的方法并排查问题。
Ubuntu 使用的是SysVinit 或 systemd 兼容模式来管理启动任务。虽然新版系统已转向systemd,但/etc/init.d/和rc.local仍被广泛支持,尤其适合快速部署自定义脚本。
常见的四种方式对比:
| 方法 | 是否推荐 | 适用场景 | 特点 |
|---|---|---|---|
| 创建独立 init 脚本(/etc/init.d) | 强烈推荐 | 无界面服务器、后台服务 | 稳定、可控性强、支持优先级设置 |
| 修改 rc.local | 可用但受限 | 简单命令启动 | 配置简单,但部分版本默认不启用 |
| 桌面环境自启动 | ❌ 不通用 | 图形界面用户 | 依赖 GUI 登录,不适合服务器 |
| systemd service 单元 | 推荐进阶使用 | 复杂服务管理 | 更现代,功能强大,学习成本略高 |
本文主推第一种方法:创建独立 init 脚本,因为它兼容性好、结构清晰、易于维护,且经过多版本 Ubuntu 实测可用。
2. 准备你的启动脚本
我们将以一个实际例子演示:假设你有一个 Python 脚本/home/ubuntu/trx/bin/mywork.py,希望它在开机时自动运行。
### 2.1 编写可执行的 Shell 包装脚本
首先,在用户主目录下创建一个.sh脚本文件作为启动入口。
cd ~ nano run.sh粘贴以下内容:
#!/bin/sh ### BEGIN INIT INFO # Provides: run.sh # Required-start: $local_fs $remote_fs $network $syslog # Required-Stop: $local_fs $remote_fs $network $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start mywork.py at boot # Description: Starts the custom Python script via shell wrapper ### END INIT INFO # 进入项目目录 cd /home/ubuntu/trx || exit 1 # 如果需要 root 权限运行程序(如绑定端口、访问设备),可在此获取 # 注意:不要在脚本中明文存储密码!此处仅为演示逻辑 # echo "your_password" | sudo -S true # 验证权限(非必要) # 执行实际任务(示例为 Python 脚本) sudo -u ubuntu python3 ./bin/mywork.py & # 返回成功状态 exit 0关键说明:
#!/bin/sh:指定解释器### BEGIN INIT INFO块:这是必须的元信息,用于update-rc.d识别脚本依赖和运行级别Default-Start: 2 3 4 5:表示在多用户文本/图形模式下启动&:后台运行,避免阻塞系统启动sudo -u ubuntu:以普通用户身份运行,提升安全性(避免全程 root)
保存并退出(Ctrl+O → Enter → Ctrl+X)。
3. 安装脚本到系统启动目录
接下来,把脚本移动到系统标准的启动脚本目录,并设置权限。
### 3.1 复制脚本到 /etc/init.d/
sudo cp ~/run.sh /etc/init.d/### 3.2 设置可执行权限
sudo chmod +x /etc/init.d/run.sh这一步非常重要,否则系统无法执行该脚本。
你可以通过以下命令确认权限是否正确:
ls -l /etc/init.d/run.sh输出应包含-rwxr-xr-x,表示所有用户都有执行权限。
4. 注册开机启动项
使用update-rc.d工具将脚本注册为开机启动服务。
sudo update-rc.d run.sh defaults 96参数解释:
defaults:使用默认的启动/停止优先级(S96/K04)96:启动顺序编号,数字越大越晚启动。如果你的脚本依赖网络,建议设为 90 以上,确保网络已就绪。
小贴士:常见服务优先级参考
- 网络服务:约 S90
- 自定义脚本:建议 S95~S99,防止依赖未加载
执行后你会看到类似提示:
Adding system startup for /etc/init.d/run.sh ... /etc/rc0.d/K04run.sh -> ../init.d/run.sh /etc/rc1.d/K04run.sh -> ../init.d/run.sh /etc/rc2.d/S96run.sh -> ../init.d/run.sh ...这意味着脚本已在各个运行级别中注册。
5. 验证脚本能否手动运行
在重启之前,务必先测试脚本能否正常执行。
sudo /etc/init.d/run.sh start观察是否有错误输出。如果一切正常,说明脚本可以被系统调用。
你也可以尝试以下命令查看其状态(尽管我们没实现 status 功能):
sudo service run.sh start提示:若需支持
service run.sh status,可在脚本中添加 case 判断处理start|stop|restart|status参数,本文为简化暂不展开。
6. 测试开机自动执行效果
现在进行最终验证。
sudo reboot系统重启后,等待片刻,然后检查你的程序是否已在运行。
例如,如果你的mywork.py启动了一个 HTTP 服务,可以用:
ps aux | grep mywork.py或者监听端口:
netstat -tuln | grep :8080如果能看到进程存在,恭喜你——开机启动已成功配置!
7. 如何卸载开机启动脚本
当你不再需要这个启动项时,可以轻松移除。
### 7.1 删除启动链接
sudo update-rc.d -f run.sh remove注意:
-f表示强制删除,会移除所有符号链接。
### 7.2 删除脚本文件(可选)
sudo rm /etc/init.d/run.sh至此,该启动项已完全清除。
8. 常见问题与解决方案
即使严格按照步骤操作,也可能遇到问题。以下是高频故障及应对策略。
### 8.1 脚本未执行,无任何反应
可能原因:
- 脚本没有可执行权限
- INIT INFO 注释块缺失或格式错误
- 路径写错(如 cd 到不存在的目录)
排查方法:
sudo /etc/init.d/run.sh start手动运行看报错信息。
### 8.2 提示 “Job is already running” 或 “not enabled”
这是systemd对旧脚本的兼容警告,通常不影响执行。只要脚本能跑起来,可忽略。
### 8.3 依赖网络的服务启动失败
现象:脚本中访问数据库、API 失败。
原因:网络尚未准备好。
解决办法:
- 将启动优先级调低(即数字更大),如
S99 - 在脚本中加入等待机制:
# 等待网络接口激活 while ! ping -c1 google.com &>/dev/null; do sleep 1 done### 8.4 输出日志无法查看
建议在脚本中重定向输出,便于调试:
python3 ./bin/mywork.py >> /var/log/mywork.log 2>&1 &同时确保日志目录可写:
sudo touch /var/log/mywork.log sudo chown ubuntu:ubuntu /var/log/mywork.log9. 替代方案:使用 rc.local(备用推荐)
如果上述方法因系统版本问题不可用,可尝试启用rc.local。
### 9.1 检查是否存在 rc.local 文件
ls /etc/rc.local如果没有,创建它:
sudo nano /etc/rc.local内容如下:
#!/bin/bash # # rc.local # # This script is executed at the end of each multiuser runlevel. # Make sure that the script will "exit 0" on success. # Your command here su - ubuntu -c "cd /home/ubuntu/trx && python3 ./bin/mywork.py &" exit 0### 9.2 设置可执行权限
sudo chmod +x /etc/rc.local### 9.3 启用 rc-local 服务(仅 systemd 系统需要)
sudo systemctl enable rc-local sudo systemctl start rc-local注意:Ubuntu 20.04+ 默认可能未安装
rc-local.service,需手动创建或改用其他方式。
10. 总结:掌握核心,灵活应用
通过本文的详细指导,你应该已经掌握了在 Ubuntu 上配置开机启动脚本的完整流程。回顾一下关键步骤:
- 编写带 INIT INFO 的 shell 脚本
- 复制到
/etc/init.d/并赋权 - 使用
update-rc.d注册启动项 - 测试手动执行与重启验证
- 学会卸载与排错
这套方法适用于绝大多数基于 Debian/Ubuntu 的系统,无论是物理机、虚拟机还是云服务器镜像(如本文提到的“测试开机启动脚本”镜像),均可直接套用。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。