江西省网站建设_网站建设公司_C#_seo优化
2026/1/17 3:26:11 网站建设 项目流程

Linux运维小技巧:测试开机启动脚本提升效率

1. 引言

在Linux系统运维中,自动化是提升效率的核心手段之一。尤其是在服务器部署、嵌入式设备或工控机场景下,常常需要某些脚本在系统启动时自动运行,例如环境初始化、服务拉起、日志清理等任务。手动执行不仅耗时,还容易遗漏。

本文将围绕“如何在Ubuntu系统中配置开机自启动脚本”这一主题,系统性地介绍三种主流且实用的方法:/etc/init.d+update-rc.drc.local和桌面级自启动管理(通过gnome-session-properties)。每种方法都配有可运行的测试脚本和详细操作步骤,帮助读者根据实际场景选择最合适的方案。

文章内容基于真实运维实践,涵盖权限设置、执行顺序控制、调试建议及常见问题处理,适合中级以上Linux用户参考。

2. 测试脚本准备

在开始配置开机启动前,首先准备一个简单的测试脚本用于验证功能是否生效。

2.1 创建测试脚本

#!/bin/bash # test.sh - 开机启动测试脚本 cd /home/Desktop/ ls > /home/Desktop/startup_test.log echo "OK! Script executed at $(date)" >> /home/Desktop/startup_test.log exit 0

2.2 脚本说明

  • 切换到桌面目录;
  • 执行ls命令并将输出写入日志文件;
  • 添加时间戳信息,便于确认执行时刻;
  • 使用绝对路径更佳(如/usr/bin/ls),避免PATH问题。

2.3 设置可执行权限

chmod +x /home/Desktop/test.sh

提示:建议先手动运行一次脚本,确保无语法错误且能正常生成日志文件。


3. 方法一:使用 /etc/init.d 配合 update-rc.d

这是传统SysVinit系统的标准方式,适用于仍使用init作为初始化系统的Ubuntu版本(如16.04及更早版本)。

3.1 移动脚本至 init.d 目录

sudo cp /home/Desktop/test.sh /etc/init.d/testscript sudo chmod 755 /etc/init.d/testscript

推荐使用755权限而非777,保证安全性和规范性。

3.2 注册为开机启动项

sudo update-rc.d testscript defaults

该命令会为脚本创建软链接到各个运行级别对应的/etc/rcX.d/目录中,其中:

  • Sxx表示 Start,xx为优先级数字;
  • 默认优先级范围通常为S20S80

3.3 自定义启动优先级

若需延迟执行(例如等待网络就绪),可指定更高数值:

sudo update-rc.d testscript defaults 90

此时脚本将以S90testscript的形式出现在 rc 目录中,较晚执行。

3.4 移除开机启动

如需取消注册:

sudo update-rc.d -f testscript remove

-f参数强制删除相关符号链接。

3.5 注意事项

  • 脚本必须具备正确的Shebang(#!/bin/bash#!/bin/sh);
  • 建议添加 LSB 兼容头(用于现代兼容性):
### BEGIN INIT INFO # Provides: testscript # Required-Start: $local_fs $network # Required-Stop: $local_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Run test script at boot # Description: A simple script to log startup info ### END INIT INFO

加入此头部后,部分工具可正确识别依赖关系。


4. 方法二:通过 GNOME 桌面自启动管理(gnome-session-properties)

对于带有图形界面的Ubuntu桌面系统(如18.04 LTS及以上),推荐使用图形化方式配置用户级自启动程序。

4.1 启动自定义配置工具

打开终端并运行:

gnome-session-properties

该命令会弹出“启动应用程序首选项”窗口。

4.2 添加新启动项

点击“添加”按钮,填写以下字段:

  • 名称:Test Startup Script
  • 命令gnome-terminal -x bash -c "/home/Desktop/test.sh; exec bash"
  • 注释:运行测试脚本并保持终端开启(可选)

exec bash可防止终端闪退,便于观察输出结果。

4.3 两种实现模式对比

间接启动法:利用.bashrc

编辑用户主目录下的.bashrc文件:

echo "/home/Desktop/test.sh" >> ~/.bashrc

缺点:每次打开终端都会执行,不符合“仅开机一次”的需求。

直接启动法:专用命令调用

使用gnome-terminal -x bash -c "..."方式直接执行脚本,更加精准可控。

4.4 适用场景

  • 工控机自动登录桌面后执行初始化脚本;
  • 需要与GUI交互的任务(如弹窗提醒、数据显示);
  • 用户空间服务启动(非系统级);

建议配合自动登录功能使用,可在/etc/gdm3/custom.conf中启用AutomaticLoginEnable=true


5. 方法三:使用 rc.local 实现系统级启动

尽管在Systemd时代rc.local已被弱化,但在多数Ubuntu发行版中仍保留支持,是一种轻量、直观的启动方式。

5.1 编辑 rc.local 文件

确保文件存在并具有执行权限:

sudo chmod +x /etc/rc.local

编辑内容:

#!/bin/sh -e # # rc.local # This script is executed at the end of each multiuser runlevel. # Your command here: su - user -c "cd /home/user/Desktop && ./test.sh" exit 0

注意:

  • user替换为实际用户名;
  • 必须放在exit 0之前;
  • 若未以sh -e结尾可能导致阻塞。

5.2 系统兼容性说明

Ubuntu 18.04+ 默认可能未启用rc.local服务。需手动启用:

sudo systemctl enable rc-local

并创建单元文件/etc/systemd/system/rc-local.service

[Unit] Description=/etc/rc.local Compatibility ConditionPathExists=/etc/rc.local [Service] Type=forking ExecStart=/etc/rc.local start TimeoutSec=0 StandardOutput=tty RemainAfterExit=yes SysVStartPriority=99 [Install] WantedBy=multi-user.target

5.3 执行时机特点

  • 在网络和文件系统就绪后执行;
  • 属于root上下文,但可通过su切换用户;
  • 不适合长时间运行或阻塞型任务;
  • 日志可通过journalctl -u rc-local查看。

6. 多方法对比分析

维度/etc/init.d+update-rc.dgnome-session-propertiesrc.local
适用系统SysVinit / 旧版Ubuntu桌面版Ubuntu(GNOME)所有Ubuntu(需启用)
执行层级系统级用户级系统级
是否需要图形界面
启动优先级控制支持(NN编号)不支持依赖位置(最后执行)
调试难度中等(需查syslog)容易(可见终端输出)较难(依赖journalctl)
安全性高(标准流程)中(用户权限)高(root执行)
推荐场景服务类脚本、守护进程桌面初始化、GUI任务快速原型、一次性任务

选型建议

  • 若为服务器环境 → 优先考虑systemd service(见第7节扩展);
  • 若为嵌入式设备带桌面 → 推荐gnome-session-properties
  • 若追求简单快速 → 使用rc.local
  • 若需兼容老系统 → 采用/etc/init.d方案。

7. 扩展建议:推荐使用 systemd 服务(现代最佳实践)

虽然本文聚焦传统方法,但从长期维护角度出发,强烈建议使用systemd服务替代上述方案

7.1 创建 systemd 服务单元

新建文件/etc/systemd/system/testscript.service

[Unit] Description=Test Startup Script After=network.target [Service] Type=oneshot ExecStart=/home/Desktop/test.sh RemainAfterExit=yes User=user WorkingDirectory=/home/Desktop [Install] WantedBy=multi-user.target

7.2 启用服务

sudo systemctl daemon-reexec sudo systemctl enable testscript.service sudo systemctl start testscript.service

7.3 优势总结

  • 标准化、结构清晰;
  • 支持依赖声明(如After=network.target);
  • 易于调试(journalctl -u testscript.service);
  • 支持重启策略、超时控制等高级特性;
  • 兼容所有现代Linux发行版。

8. 总结

8.1 技术价值回顾

本文系统介绍了三种在Ubuntu系统中实现开机启动脚本的方法:

  • /etc/init.d+update-rc.d:适用于传统init系统,具备良好的优先级控制能力;
  • gnome-session-properties:面向桌面用户的友好方案,适合图形化任务;
  • rc.local:简洁直接,适合作为临时或快速验证手段。

每种方法均有其适用边界,关键在于根据系统架构、执行环境和运维目标做出合理选择。

8.2 实践建议

  1. 优先使用 systemd:对于新项目,应摒弃传统方式,转向systemd service
  2. 避免权限滥用:不要随意赋予脚本777权限,遵循最小权限原则;
  3. 添加日志记录:所有启动脚本应输出执行状态到日志文件或journal;
  4. 测试先行:每次修改后应重启验证,不可仅依赖手动执行判断;
  5. 注意执行上下文:区分 root 与普通用户环境,路径、权限、DISPLAY变量均可能影响结果。

掌握这些小技巧,不仅能提升日常运维效率,还能增强对Linux启动流程的理解,为构建稳定可靠的自动化系统打下坚实基础。


获取更多AI镜像

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

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

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

立即咨询