news 2026/4/7 21:03:13

从0开始学Linux自启动:rc-local.service详细配置

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从0开始学Linux自启动:rc-local.service详细配置

从0开始学Linux自启动:rc-local.service详细配置

1. 引言

1.1 为什么需要开机自启动脚本

在Linux系统运维和自动化部署中,经常需要某些服务或脚本在系统启动时自动运行。例如:启动监控程序、加载环境变量、运行Python数据采集脚本等。虽然现代Linux发行版普遍采用systemd作为初始化系统,但许多用户仍习惯使用传统的/etc/rc.local方式配置开机任务。

然而,从Ubuntu 18.04等较新版本开始,rc.local默认不再启用,必须通过systemd服务单元手动激活。本文将带你从零开始,完整掌握如何在基于systemd的系统中恢复并正确配置rc-local.service,实现可靠的开机自启动功能。

1.2 本文能帮你解决的问题

  • 如何在Ubuntu 18.04+或其它systemd系统中启用rc.local
  • rc-local.service文件各参数的含义解析
  • 如何安全地编写和调试自启动脚本
  • 常见错误排查方法(权限、编码、路径等问题)
  • 最佳实践:使用rc.local作为“启动索引”调用外部脚本

2. rc-local.service 配置详解

2.1 创建 systemd 服务单元文件

首先需要创建一个systemd服务定义文件,用于兼容传统的rc.local机制。

执行以下命令创建服务文件:

sudo vim /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

2.2 关键参数解析

参数含义说明
Description服务描述信息,便于识别
ConditionPathExists只有当/etc/rc.local存在时才启动服务
Type=forking表示服务会通过fork()方式后台运行
ExecStart指定启动时执行的命令
TimeoutSec=0禁用超时限制,避免脚本未完成就被终止
RemainAfterExit=yes即使主进程退出,也认为服务处于“活动”状态
SysVStartPriority=99设置启动优先级(数字越大越晚启动)
WantedBy=multi-user.target在多用户模式下启用此服务

特别注意TimeoutSec=0非常重要。若不设置,长时间运行的脚本可能被systemd强制中断。


3. 编写与配置 rc.local 脚本

3.1 创建 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

3.2 脚本编写注意事项

  • 第一行#!/bin/sh -e
    -e表示一旦某条命令出错立即退出,防止错误累积。

  • 必须以exit 0结尾
    如果没有正常退出码,systemd会认为服务启动失败。

  • 避免阻塞操作
    不要在此脚本中运行无限循环或交互式程序,除非你明确知道后果。

  • 使用绝对路径
    所有命令、脚本、文件引用建议使用完整路径,避免因环境变量缺失导致失败。


4. 权限设置与服务启用

4.1 添加可执行权限

确保rc.local具有可执行权限:

sudo chmod +x /etc/rc.local

你可以使用以下命令验证权限是否正确:

ls -l /etc/rc.local

输出应包含rwx权限,如:

-rwxr-xr-x 1 root root ...

4.2 启用 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.

这表示已创建开机自启软链接。

4.3 手动启动并检查状态

可以立即启动服务进行测试:

sudo systemctl start rc-local.service

查看服务运行状态:

sudo systemctl status rc-local.service

正常状态下应显示:

Active: active (exited) since ...

如果出现failedexited with code, 则需根据日志排查问题。


5. 验证自启动效果

5.1 重启系统并检查日志

重启服务器以验证开机执行效果:

sudo reboot

系统重新登录后,检查日志文件是否存在:

cat /usr/local/test.log

预期输出:

看到这行字,说明添加自启动脚本成功。

若文件存在且内容正确,则表明rc.local已成功执行。

5.2 使用 journalctl 查看详细日志

更详细的调试信息可通过journalctl获取:

sudo journalctl -u rc-local.service --since today

该命令将显示今天内rc-local.service的所有日志记录,有助于定位脚本执行中的具体错误。


6. 实际应用场景:启动 Python 脚本

6.1 设计思路:分离主启动与业务逻辑

最佳实践是不要直接在/etc/rc.local中写复杂逻辑,而是将其作为“启动入口”,调用外部独立脚本。

结构建议如下:

/etc/rc.local → 主启动入口 └── 调用 /home/user/startup.sh └── 运行 Python 脚本 ce.py

这样便于维护、测试和权限管理。

6.2 创建业务脚本 test.sh

创建用户级脚本文件:

sudo vim /home/lbw/test.sh

内容如下:

#!/bin/bash cd /home/lbw/ python3 ce.py exit 0

赋予执行权限:

sudo chmod +x /home/lbw/test.sh

6.3 编写测试用 Python 程序

创建ce.py用于验证执行:

sudo vim /home/lbw/ce.py

内容为:

with open("/home/lbw/sb.txt", "w") as f: f.write("SB")

注意:路径必须可写,推荐使用绝对路径。

6.4 修改 rc.local 调用外部脚本

编辑/etc/rc.local,替换原有echo语句:

#!/bin/sh -e # 调用自定义启动脚本 /home/lbw/test.sh exit 0

保存后重启系统,检查/home/lbw/sb.txt是否生成。


7. 常见问题与排错指南

7.1 服务状态异常排查

systemctl status rc-local.service显示失败时,常见原因包括:

问题解决方案
rc.local: Permission denied确保已执行chmod +x /etc/rc.local
No such file or directory检查脚本中调用的路径是否正确
python: command not found使用which python3获取完整路径(如/usr/bin/python3
中文字符导致解析失败避免在脚本中使用中文注释或字符串,或确保文件保存为UTF-8编码

7.2 日志分析技巧

使用以下命令查看最详细的启动过程日志:

sudo journalctl -u rc-local.service -b

其中-b表示仅显示本次启动的日志。

重点关注是否有以下关键词:

  • Failed at step EXEC spawning...
  • Permission denied
  • No such file or directory
  • Exited with code

这些信息能快速定位脚本执行失败的具体位置。

7.3 安全性建议

  • 最小权限原则:尽量避免以root身份运行长期服务,可通过su - user -c "script"切换用户。
  • 日志记录:在关键脚本中添加时间戳日志,便于追踪执行情况。
  • 错误处理:对关键步骤添加判断逻辑,例如:
if ! python3 /home/lbw/ce.py; then echo "$(date): Script failed!" >> /var/log/startup.log fi

8. 总结

8.1 核心要点回顾

  1. rc-local.servicesystemd时代恢复传统rc.local的关键,需手动创建并启用。
  2. 服务文件中的TimeoutSec=0RemainAfterExit=yes是稳定运行的保障,不可省略。
  3. /etc/rc.local必须有可执行权限且以exit 0结尾,否则服务会被标记为失败。
  4. 推荐使用rc.local作为“启动索引”调用外部脚本,提升可维护性和安全性。
  5. 调试时善用systemctl statusjournalctl工具链,能极大提高排错效率。

8.2 最佳实践建议

  • 将业务逻辑与启动配置分离,保持rc.local简洁。
  • 所有路径使用绝对路径,避免环境变量问题。
  • 对重要操作添加日志输出,方便后期审计。
  • 测试阶段先手动运行脚本,确认无误后再加入自启动。

获取更多AI镜像

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/16 4:05:59

ModbusTCP协议详解应用场景:工厂自动化集成示例

ModbusTCP协议详解:从原理到工厂自动化实战你有没有遇到过这样的场景?一条自动化产线上的PLC、变频器、智能电表来自不同厂家,通信协议五花八门,数据采集困难重重。操作员在HMI上点“启动”,结果传送带毫无反应——排查…

作者头像 李华
网站建设 2026/3/31 3:37:58

UI-TARS-desktop进阶指南:Qwen3-4B-Instruct模型微调实战

UI-TARS-desktop进阶指南:Qwen3-4B-Instruct模型微调实战 1. UI-TARS-desktop简介 Agent TARS 是一个开源的多模态 AI Agent 框架,致力于通过融合 GUI 自动化、视觉理解(Vision)等能力,构建能够与现实世界工具无缝交…

作者头像 李华
网站建设 2026/4/5 6:51:01

OpenCode与Claude Code:AI编程助手深度选择指南

OpenCode与Claude Code:AI编程助手深度选择指南 【免费下载链接】opencode 一个专为终端打造的开源AI编程助手,模型灵活可选,可远程驱动。 项目地址: https://gitcode.com/GitHub_Trending/openc/opencode 在AI技术重构编程工作流的今…

作者头像 李华
网站建设 2026/3/27 8:35:10

AI开发工具安全认证终极指南:从配置到实战的完整解决方案

AI开发工具安全认证终极指南:从配置到实战的完整解决方案 【免费下载链接】opencode 一个专为终端打造的开源AI编程助手,模型灵活可选,可远程驱动。 项目地址: https://gitcode.com/GitHub_Trending/openc/opencode 在AI开发工具日益普…

作者头像 李华
网站建设 2026/3/31 15:32:46

ppo越容易成功的情况价值估计越高是吗

是的,完全正确!在强化学习中,价值估计(Value Estimate)的核心含义就是:当前状态距离成功有多近、有多容易成功。更准确地说:一个状态的价值 V(s)V(s) 越高,意味着从该状态出发&#…

作者头像 李华