抚顺市网站建设_网站建设公司_Bootstrap_seo优化
2026/1/22 4:17:31 网站建设 项目流程

超详细图解: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.log

9. 替代方案:使用 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 上配置开机启动脚本的完整流程。回顾一下关键步骤:

  1. 编写带 INIT INFO 的 shell 脚本
  2. 复制到/etc/init.d/并赋权
  3. 使用update-rc.d注册启动项
  4. 测试手动执行与重启验证
  5. 学会卸载与排错

这套方法适用于绝大多数基于 Debian/Ubuntu 的系统,无论是物理机、虚拟机还是云服务器镜像(如本文提到的“测试开机启动脚本”镜像),均可直接套用。


获取更多AI镜像

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询