2026/2/9 21:00:44
网站建设
项目流程
优秀网站设计参考,网站开发行业竞争大吗,小程序开发哪里有,wordpress清楚所有评论初学者福音#xff1a;图文并茂讲解开机自启全流程
你是不是也遇到过这样的问题#xff1a;写好了Python脚本#xff0c;想让它开机自动运行#xff0c;结果重启后发现什么都没发生#xff1f;试了网上各种方法#xff0c;不是报错就是没反应#xff0c;最后只能手动点…初学者福音图文并茂讲解开机自启全流程你是不是也遇到过这样的问题写好了Python脚本想让它开机自动运行结果重启后发现什么都没发生试了网上各种方法不是报错就是没反应最后只能手动点开终端再执行一遍……别急这篇文章就是为你准备的。我会用最直白的语言、最清晰的步骤、最贴近真实操作的截图逻辑文字描述代替图片带你从零搞定Linux系统下的开机自启——不讲虚的不堆术语每一步都可复制、可验证、可排查。全文基于Ubuntu 20.04/22.04等现代systemd系统兼容18.04及以上完全避开老旧rc.local失效的坑手把手带你重建一个稳定、可靠、易维护的开机启动机制。哪怕你刚接触Linux三天只要会敲几行命令就能顺利完成。1. 为什么老办法不管用了在Ubuntu 14.04时代大家习惯直接编辑/etc/rc.local文件加一行脚本就完事。但自16.04起Ubuntu全面转向systemd管理服务rc.local默认被禁用不是文件不存在而是它根本不被执行。你可能会看到这些典型现象编辑完/etc/rc.local并加了chmod x重启后cat /var/log/syslog | grep rc.local却查不到任何记录手动运行sudo /etc/rc.local能成功但开机时就是不触发systemctl status rc-local显示inactive (dead)或failed这不是你写错了是系统底层机制变了。我们不再“修复”rc.local而是给它配一个systemd服务容器让它重新被系统识别和调度——这才是现代Linux的正确打开方式。2. 核心思路用systemd“托住”你的启动脚本整个流程其实就三件事写一个systemd服务单元文件告诉系统“这个脚本我需要开机跑”写一个真正的启动脚本比如test.sh里面调用你的Python程序把脚本和权限、路径、执行环境都配对避免“找不到python”“路径不对”“中文乱码”等新手高频雷下面所有操作我都按真实终端顺序展开命令可直接复制粘贴关键位置我会说明“为什么这么写”。2.1 创建systemd服务文件rc-local.service打开终端执行sudo nano /etc/systemd/system/rc-local.service推荐用nano而非vim对新手更友好按CtrlO保存CtrlX退出把以下内容完整粘贴进去注意不要删减空行和缩进[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只有当/etc/rc.local文件存在时这个服务才启动——避免误启Typeforking因为rc.local本身会fork子进程必须声明类型否则systemd会误判为“启动失败”RemainAfterExityes表示即使rc.local执行完了服务状态仍保持“active”方便后续依赖判断WantedBymulti-user.target这是Linux多用户模式的目标相当于“系统准备好后就运行它”2.2 创建并配置 /etc/rc.local 启动索引文件现在创建真正的启动入口文件sudo nano /etc/rc.local粘贴以下内容第一行必须是#!/bin/sh -e结尾必须有exit 0#!/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. # 下面这行是测试用重启后检查 /usr/local/test.log 是否生成 echo 开机自启服务已激活 /usr/local/test.log # 这里是你真正要运行的脚本推荐放在这里统一调度 # 注意路径必须写绝对路径不能用 ~ 或 $HOME sh /home/yourusername/test.sh exit 0重要提醒把上面的yourusername换成你自己的用户名如ubuntu、john可用whoami命令确认sh /home/.../test.sh是调用你自己的脚本不是直接写Python命令——这样更安全、更易调试2.3 给rc.local加执行权限sudo chmod x /etc/rc.local这一步不能省Linux下任何脚本要被执行必须有x权限。没有这行systemd会静默跳过。2.4 启用并启动服务启用服务让系统记住“下次开机要运行它”sudo systemctl enable rc-local.service立即启动一次不用重启也能验证sudo systemctl start rc-local.service检查是否成功sudo systemctl status rc-local.service正常输出中应包含Active: active (exited)或active (running)Loaded: loaded (/etc/systemd/system/rc-local.service; enabled; vendor preset: enabled)最后一行类似Started /etc/rc.local Compatibility❌ 如果显示failed别慌——直接看下一条。3. 常见失败原因与排查指南新手必读90%的开机自启失败都出在这几个地方。我们逐个击破3.1 日志查看第一手线索无论状态显示如何最准的判断方式是看日志sudo journalctl -u rc-local.service -n 50 --no-pager-n 50显示最近50行--no-pager不翻页直接输出到终端你会看到类似这样的关键信息Mar 15 10:22:33 ubuntu systemd[1]: Starting /etc/rc.local Compatibility... Mar 15 10:22:33 ubuntu rc.local[1234]: /etc/rc.local: 15: sh: /home/ubuntu/test.sh: Permission denied→ 看到Permission denied说明test.sh没加执行权限回退到2.5节补上。再比如Mar 15 10:22:33 ubuntu rc.local[1234]: /etc/rc.local: 15: sh: python: not found→ 说明脚本里写的python命令系统找不到可能是没装或该用python3。3.2 脚本路径与环境变量陷阱你在终端里能运行python3 ce.py不代表开机时也能。原因有两个路径是相对的开机时当前目录是/不是你的家目录PATH环境变量不同systemd服务默认PATH极简通常只有/usr/bin:/bin不包含你.bashrc里加的路径正确做法所有路径写绝对路径/home/xxx/test.sh不是./test.shPython脚本里用#!/usr/bin/env python3开头或直接写python3 /home/xxx/ce.py不要依赖source ~/.bashrc—— 它在systemd环境下根本不会加载3.3 中文字符与编码问题隐藏杀手参考博文里提到“我犯得错误就是py文件存在中文而无法运行”。这是真事。Python 2默认ASCIIPython 3虽支持UTF-8但systemd启动时LANG可能未设置导致读取含中文的.py文件报错SyntaxError: Non-UTF-8 code starting with \xe4 in file /home/xxx/ce.py解决方案二选一推荐Python脚本里第一行加编码声明# -*- coding: utf-8 -*- with open(sb.txt, w) as f: f.write(SB)或者彻底避免脚本中出现中文变量名、注释、字符串都用英文4. 实战部署你的第一个开机脚本以Python为例我们来走一遍完整闭环从写代码 → 写shell → 配置启动 → 验证结果。4.1 写一个简单的Python程序假设你想开机自动创建一个标记文件nano /home/$(whoami)/ce.py内容如下注意无中文路径绝对#!/usr/bin/env python3 import os # 写入当前时间戳证明是开机时运行的 with open(/tmp/autostart_marker.txt, w) as f: f.write(fAuto-started at {os.popen(date).read().strip()}\n) print( Python脚本已执行)os.popen(date)是为了演示动态内容实际项目中建议用datetime.now()更规范4.2 写调用它的shell脚本nano /home/$(whoami)/test.sh内容如下注意指定python3用绝对路径#!/bin/bash # 切换到脚本所在目录可选但推荐 cd /home/$(whoami) # 执行Python脚本 /usr/bin/python3 /home/$(whoami)/ce.py # 可选记录日志便于排查 echo $(date): ce.py executed /tmp/autostart.log加执行权限chmod x /home/$(whoami)/test.sh4.3 更新rc.local指向你的脚本回到/etc/rc.local确保最后一段是sh /home/$(whoami)/test.sh exit 0再次确认$(whoami)已替换为真实用户名4.4 验证与重启测试先手动触发一次sudo /etc/rc.local检查结果cat /tmp/autostart_marker.txt # 应输出类似Auto-started at Mon Mar 15 10:30:22 CST 2024 cat /tmp/autostart.log # 应有时间戳记录一切正常后重启验证终极效果sudo reboot等待系统起来后直接运行cat /tmp/autostart_marker.txt如果看到带时间戳的内容恭喜你——开机自启已稳稳落地。5. 进阶建议让启动更健壮、更可控你已经掌握了核心流程下面这几个小技巧能让日常维护事半功倍5.1 用systemd原生方式替代rc.local更推荐如果你只启动一个脚本其实可以直接写专属service无需绕路rc.localsudo nano /etc/systemd/system/myapp.service内容示例[Unit] DescriptionMy Python App Auto Start Afternetwork.target [Service] Typesimple Useryourusername WorkingDirectory/home/yourusername ExecStart/usr/bin/python3 /home/yourusername/ce.py Restartalways RestartSec10 [Install] WantedBymulti-user.target启用它sudo systemctl daemon-reload sudo systemctl enable myapp.service sudo systemctl start myapp.service优势每个应用独立管理互不影响Restartalways自动崩溃恢复User指定运行用户避免root权限滥用日志统一归集journalctl -u myapp.service5.2 启动延迟与依赖控制有些脚本依赖网络、数据库或GPU驱动需等它们就绪再运行Afternetwork.target等网络通了再启动Afterpostgresql.service等PostgreSQL启动后再运行Wantsnetwork.target声明强依赖查看系统所有targetsystemctl list-units --typetarget5.3 日志轮转与清理防磁盘占满长期运行的脚本日志容易暴涨。加一行到service文件里[Service] ... StandardOutputappend:/var/log/myapp.log StandardErrorappend:/var/log/myapp.log再配个logrotate新建/etc/logrotate.d/myapp/var/log/myapp.log { daily missingok rotate 30 compress delaycompress notifempty }6. 总结你已掌握的不仅是“开机自启”更是Linux服务思维回顾一下你今天完成了理解了systemd与传统init的本质区别搭建了可复用的rc-local兼容服务框架成功部署并验证了Python脚本的开机自启掌握了三大高频故障权限、路径、编码的定位与解决方法学会了用journalctl看日志、用systemctl管服务、用logrotate护日志这不是一个“一次性技巧”而是一套可迁移的能力以后部署Flask网站、启动TensorFlow训练、挂载NAS存储……底层逻辑一脉相承。最后送你一句实操口诀“脚本写绝对路径权限必须加x日志先看journal报错别猜靠证据。”获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。