2026/2/17 20:08:23
网站建设
项目流程
番禺建设网站外包,米趋外贸网站建设,上海ui设计,雄安做网站优化一看就会的操作指南#xff1a;Linux开机自启这样配
1. 引言
1.1 业务场景描述
在实际的服务器运维和嵌入式设备管理中#xff0c;经常需要让某些脚本或服务在系统启动时自动运行。例如#xff0c;启动一个数据采集程序、初始化环境变量、挂载特定文件系统#xff0c;或…一看就会的操作指南Linux开机自启这样配1. 引言1.1 业务场景描述在实际的服务器运维和嵌入式设备管理中经常需要让某些脚本或服务在系统启动时自动运行。例如启动一个数据采集程序、初始化环境变量、挂载特定文件系统或者运行一个Python监控脚本。传统上/etc/rc.local是实现这一目标的简单而有效的方式。然而随着 systemd 成为现代 Linux 发行版如 Ubuntu 18.04 及以后版本的默认初始化系统rc.local不再默认启用直接编辑该文件将无法实现开机自启功能。本文将手把手教你如何在基于 systemd 的系统中重新激活rc.local并配置自定义脚本开机运行。1.2 痛点分析旧方法失效Ubuntu 18.04 默认不再支持/etc/rc.local自动执行。权限与路径问题即使创建了 rc.local 文件若未正确设置权限或服务未启用仍无法执行。调试困难脚本出错时无明确提示需通过 systemctl status 查看日志排查。编码与依赖问题如 Python 脚本包含中文注释、缺少 shebang 或依赖未安装会导致执行失败。1.3 方案预告本文将介绍一种兼容性强、结构清晰的解决方案 1. 创建rc-local.service单元文件以恢复rc.local功能 2. 编写并授权/etc/rc.local脚本 3. 启用并测试服务状态 4. 通过调用外部.sh脚本的方式实现灵活的开机任务管理。该方案适用于 Ubuntu 18.04、20.04、Debian 等主流发行版具有良好的可维护性和扩展性。2. 技术方案选型2.1 为什么选择 rc.local 兼容模式尽管 systemd 支持直接编写 service 文件来注册自启动服务但对于初学者或轻量级需求而言这种方式学习成本较高且每个脚本都需要单独配置 unit 文件。相比之下使用rc.local作为“启动索引”具有以下优势对比维度直接编写 systemd service使用 rc.local 兼容模式配置复杂度高需了解 unit 结构低类 Shell 脚本维护成本每个服务独立配置统一入口集中管理调试便捷性需 systemctl 命令查日志日志输出直观适用场景复杂服务依赖控制简单脚本/命令启动兼容性所有 systemd 系统需手动启用 rc-local因此在不需要精细控制依赖关系和服务生命周期的场景下启用rc.local兼容模式是更高效的选择。3. 实现步骤详解3.1 建立 rc-local.service 文件systemd 并不默认加载/etc/rc.local我们需要手动创建一个 service 单元文件来激活它。执行以下命令创建服务文件sudo vim /etc/systemd/system/rc-local.service将以下内容粘贴进去[Unit] Description/etc/rc.local Compatibility ConditionPathExists/etc/rc.local [Service] Typeforking ExecStart/etc/rc.local start TimeoutSec0 StandardOutputtty RemainAfterExityes SysVStartPriority99 [Install] WantedBymulti-user.target参数说明ConditionPathExists确保/etc/rc.local存在才启动服务Typeforking表示脚本会 fork 子进程后退出主进程符合 rc.local 行为RemainAfterExityes服务被视为“仍在运行”即使脚本已执行完毕WantedBymulti-user.target在多用户模式下启动即常规登录环境。3.2 创建并配置 /etc/rc.local 脚本接下来创建实际执行的脚本文件sudo vim /etc/rc.local填入以下内容#!/bin/sh -e # # rc.local # # This script is executed at the end of each multiuser runlevel. # Make sure that the script will exit 0 on success or any other # value on error. # # In order to enable or disable this script just change the execution # bits. # # By default this script does nothing. echo 看到这行字说明添加自启动脚本成功。 /usr/local/test.log exit 0注意 -#!/bin/sh -e中的-e表示一旦某条命令出错就立即终止脚本避免错误扩散 - 最后必须有exit 0否则 systemd 会认为脚本执行失败 - 若不写exit 0可能导致服务状态显示为 failed。3.3 设置权限并启用服务赋予脚本可执行权限sudo chmod x /etc/rc.local启用rc-local.service使其在开机时自动启动sudo systemctl enable rc-local输出应类似Created symlink /etc/systemd/system/multi-user.target.wants/rc-local.service → /etc/systemd/system/rc-local.service.这表明服务已成功注册到开机启动项。3.4 启动服务并检查状态为了验证配置是否生效可以立即启动服务而不必重启系统sudo systemctl start rc-local.service查看服务状态sudo systemctl status rc-local.service正常状态下应显示● rc-local.service - /etc/rc.local Compatibility Loaded: loaded (/etc/systemd/system/rc-local.service; enabled; vendor preset: enabled) Active: active (exited) since ...如果出现failed状态请根据提示信息进行排查常见原因包括 -/etc/rc.local没有执行权限 - 脚本中存在语法错误 - 缺少exit 0 - 文件编码为 UTF-8 with BOM导致解析异常。3.5 重启并验证日志输出重启系统以确认开机自启效果sudo reboot系统重启后检查日志文件是否存在cat /usr/local/test.log预期输出看到这行字说明添加自启动脚本成功。若能正确读取该内容则证明rc.local已成功执行。4. 进阶实践通过 rc.local 调用外部脚本4.1 设计思路建议不要直接在/etc/rc.local中编写复杂逻辑而是将其作为“启动调度器”仅用于调用外部脚本。这样做的好处是 - 提高可读性与可维护性 - 避免污染系统级配置文件 - 便于权限隔离与独立调试。4.2 创建自定义 Shell 脚本假设我们有一个 Python 脚本需要开机运行先创建对应的 shell 包装脚本sudo vim /opt/start_my_script.sh内容如下#!/bin/bash cd /home/lbw/ python3 ce.py exit 0赋予执行权限sudo chmod x /opt/start_my_script.sh4.3 编写测试用 Python 脚本创建 Python 测试脚本vim /home/lbw/ce.py内容为with open(sb.txt, w) as f: f.write(SB)确保 Python 环境可用并推荐使用绝对路径调用解释器如/usr/bin/python3以避免 PATH 问题。4.4 修改 rc.local 调用外部脚本编辑/etc/rc.local将原来的 echo 替换为调用自定义脚本#!/bin/sh -e # 调用外部启动脚本 /opt/start_my_script.sh exit 0保存后再次重启系统sudo reboot检查/home/lbw/sb.txt是否生成cat /home/lbw/sb.txt输出应为SB4.5 常见问题与解决方法问题现象可能原因解决方案rc-local.service 显示 inactive 或 failed权限不足或缺少 exit 0检查/etc/rc.local是否有x权限确认末尾有exit 0Python 脚本报错“找不到命令”python 命令未链接或 PATH 不对使用which python3获取完整路径并在脚本中使用绝对路径脚本中有中文字符报错文件编码问题或 shell 不支持保存为 UTF-8 无 BOM 格式或移除中文注释写入文件失败目标目录不存在或权限不足确保目标路径存在必要时提前 mkdir 并赋权systemctl status 显示 timeout脚本长时间阻塞未返回在 service 文件中添加TimeoutSec0已设置可通过以下命令实时查看服务执行情况journalctl -u rc-local.service --since 1 hour ago5. 总结5.1 实践经验总结本文详细演示了如何在现代 Linux 系统如 Ubuntu 18.04中恢复rc.local的开机自启功能。核心要点包括 - 必须创建rc-local.service单元文件以兼容 systemd -/etc/rc.local必须具备可执行权限且以exit 0结尾 - 推荐使用rc.local作为“启动入口”调用外部脚本提升可维护性 - 出现问题优先使用systemctl status rc-local.service和journalctl排查。5.2 最佳实践建议统一管理启动脚本将所有自定义脚本放在/opt/或/usr/local/bin/下便于集中维护使用绝对路径在脚本中尽量使用绝对路径调用命令和文件避免因环境变量差异导致失败添加日志记录可在脚本中加入时间戳日志便于追踪执行过程bash echo $(date): 自启动脚本开始执行 /var/log/boot.log获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。