核心内容摘要
解锁育儿新时代妈妈不可以App,让带娃从此轻松高效!
Linux运维入门掌握最基本的自启脚本配置你有没有遇到过这样的情况服务器重启后某个关键服务没起来业务直接中断或者每次开机都要手动执行一遍相同的命令重复又容易出错其实Linux系统早就为你准备好了可靠的解决方案——开机自启脚本。
它不依赖复杂工具不需安装额外软件只要几行清晰的配置就能让系统在启动完成的第一时间自动执行你指定的任务。
这篇文章不是讲systemd服务单元文件的高级写法也不是堆砌各种发行版差异的理论对比。
它聚焦最核心、最通用、最稳妥的一条路径用rc.local机制实现脚本自启。
无论你是刚接触Linux的新手还是需要快速验证方案的运维工程师只要你会用终端、能看懂基础Shell命令就能跟着一步步完成配置并在重启后亲眼看到效果。
我们不绕弯子不讲抽象概念只说“做什么”和“怎么做”。
明确目标与适用场景
1 这个方法能解决什么问题让一个Shell脚本在系统启动完成后自动运行比如启动监控程序、初始化数据库连接、挂载网络存储无需编写复杂的systemd service文件适合快速验证或临时需求兼容性好Ubuntu
1
04/
1
04/
20.
Debian、CentOS 7等主流发行版均原生支持部分新版系统需简单启用不依赖图形界面纯命令行环境即可完成全部操作
2 它不适合哪些情况需要严格控制服务启动顺序如必须在MySQL之后、Nginx之前启动要求服务崩溃后自动重启rc.local只执行一次失败不重试多用户环境下需为不同用户分别配置它属于系统级启动对所有用户生效生产环境长期运行的关键服务建议后续迁移到systemd管理一句话
总结这是Linux自启的“快捷键”不是“操作系统”。
它简单、直接、有效是每个运维人员都该掌握的第一块基石。
创建你的第一个自启脚本
1 选择存放位置与命名规范脚本可以放在任何有执行权限的目录下但为了清晰和安全推荐统一存放在/opt/scripts/或/usr/local/bin/。
这里我们使用/opt/scripts/因为它专为本地自定义脚本设计不易与系统文件混淆。
# 创建脚本目录如果不存在 sudo mkdir -p /opt/scripts # 进入目录 cd /opt/scripts
2 编写脚本内容新建一个名为startup-check.sh的文件内容如下#!/bin/bash # 记录启动时间便于后续排查 echo System started at $(date) /var/log/startup-check.log # 执行一个简单但可验证的操作创建一个带时间戳的测试文件 touch /tmp/startup-test-$(date %s).tmp # 可选启动一个后台小任务例如监听端口 # nc -l 8080 /dev/null /dev/null 21 exit 0逐行说明#!/bin/bash是必需的“解释器声明”告诉系统用bash来运行这个文件echo ... /var/log/...将日志追加写入系统日志目录比写在当前目录更规范、更易查找touch ...创建一个带时间戳的空文件重启后你只需ls /tmp/startup-test*就能立刻确认脚本是否执行exit 0表示脚本成功结束这对rc.local机制很重要——它会检查脚本退出码非0值可能导致后续启动流程异常
3 设置脚本执行权限Linux默认不允许执行普通文件必须显式赋予执行权sudo chmod x /opt/scripts/startup-check.sh为什么不用chmod 777777意味着“所有人可读、可写、可执行”这在生产环境中是严重安全隐患。
x只添加执行权限保留原有读写权限既安全又足够。
启用并配置 rc.local 机制
1 检查 rc.local 是否存在并启用在较新的Ubuntu
2
04或Debian系统中rc.local默认被禁用。
先确认状态sudo systemctl status rc-local如果显示inactive (dead)或报错Unit rc-local.service could not be found说明需要手动启用。
启用步骤一步到位# 创建 rc.local 文件如果不存在 sudo tee /etc/rc.local EOF #!/bin/bash # 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. # Your commands here: # cd /opt/scripts # ./startup-check.sh exit 0 EOF # 设置执行权限 sudo chmod x /etc/rc.local # 启用 systemd 服务 sudo systemctl enable rc-local sudo systemctl start rc-local这段命令做了三件事创建标准格式的rc.local文件、赋予执行权限、并通过systemd启用它。
完成后sudo systemctl status rc-local应显示active (exited)。
2 在 rc.local 中调用你的脚本现在编辑/etc/rc.local在exit 0之前插入你的脚本调用sudo nano /etc/rc.local将以下两行添加到exit 0上方cd /opt/scripts ./startup-check.sh注意必须用cd切换到脚本所在目录再执行避免因路径问题导致脚本内部相对路径失效不要用sudo ./startup-check.sh——rc.local本身就在root权限下运行重复sudo反而可能引发权限冲突保存并退出nano中按CtrlO→ 回车 →CtrlX。
验证配置是否生效
1 不重启的快速验证方法与其反复重启不如先模拟rc.local的执行环境# 以root身份直接运行 rc.local sudo /etc/rc.local # 检查日志是否写入 sudo tail -n 3 /var/log/startup-check.log # 检查测试文件是否生成 ls -t /tmp/startup-test-*.tmp | head -n 1如果日志里有时间记录且/tmp下出现了新文件说明脚本本身和rc.local调用逻辑完全正确。
2 最终验证重启系统sudo reboot等待系统完全启动后登录终端执行# 查看日志末尾确认本次启动被记录 sudo tail -n 5 /var/log/startup-check.log # 列出所有 startup-test 文件最新那个就是本次重启生成的 ls -lt /tmp/startup-test-*.tmp | head -n 1如果输出中包含类似startup-test-
tmp的文件名且时间戳与你重启时间吻合恭喜你自启脚本已稳定运行。
5.
常见问题与排错指南
1 脚本执行了但日志为空或文件没生成最常见原因是路径错误。
rc.local在系统早期启动阶段运行此时某些挂载点如/home、/mnt可能尚未就绪。
解决方案将脚本和日志路径统一放在系统根分区下如/opt/scripts/、/var/log/避开用户目录和外部存储在脚本开头加入延迟或等待逻辑仅限调试# 等待网络就绪可选 while ! ping -c1 google.com /dev/null; do sleep 2 done
2 Ubuntu
2
04 提示 “Failed to start /etc/rc.local Compatibility”这是因为新版Ubuntu彻底移除了rc.local支持。
此时有两个选择方案一推荐改用 systemd 服务轻量版# 创建服务文件 sudo tee /etc/systemd/system/startup-check.service EOF [Unit] DescriptionStartup Check Script Aftermulti-user.target [Service] Typeoneshot ExecStart/opt/scripts/startup-check.sh RemainAfterExityes [Install] WantedBymulti-user.target EOF # 启用并启动 sudo systemctl daemon-reload sudo systemctl enable startup-check.service sudo systemctl start startup-check.service方案二兼容旧习惯临时启用 rc.local参考第
1节中的启用命令它在
2
04上同样有效只是需要手动创建文件。
3 如何修改或停用已配置的自启修改脚本直接编辑/opt/scripts/startup-check.sh保存后无需其他操作下次启动即生效临时禁用注释掉/etc/rc.local中的调用行在前面加#永久删除删除/etc/rc.local中的调用行并运行sudo systemctl disable rc-local如果用的是systemd方式
6.
总结从入门到可靠落地的三个关键认知
1 理解本质而非死记步骤rc.local不是一个神秘黑盒它只是系统在完成所有基础服务启动后按顺序执行的最后一段“用户自定义代码”。
它的价值在于时机确定、权限充足、逻辑简单。
掌握这一点你就不会纠结于“为什么一定要放/etc/下”而会自然想到“我需要它在哪个阶段运行需要什么权限会不会影响其他服务”
2 日志是排错的唯一真相永远不要靠“应该执行了”来判断成功。
每一行echo、每一个touch都是你与系统之间的信使。
把日志写进/var/log/而不是当前目录或/tmp是专业运维的第一课。
3 从小处着手建立可验证的闭环本文的整个流程就是一个最小可行闭环写脚本 → 设权限 → 配rc.local → 验证日志 → 重启确认。
它不追求功能丰富只确保每一步都有明确输入、可观察输出、可重复验证。
这种思维模式比记住一百个命令更重要。
你现在拥有的不仅是一个能开机自启的脚本更是一把打开Linux自动化世界大门的钥匙。
下一步你可以尝试让它启动一个Python Web服务或者定时同步远程数据——而所有这些都建立在今天你亲手配置成功的这个坚实基础上。