济南seo外贸网站建设深圳建设工程交易中心宝安中心
2026/4/6 13:05:28 网站建设 项目流程
济南seo外贸网站建设,深圳建设工程交易中心宝安中心,较好的网站建设公司,网站建设服务版权归谁Ubuntu 16.04以后版本怎么设自启#xff1f;这里有答案 你是不是也遇到过这样的问题#xff1a;在Ubuntu 16.04或更新的系统上#xff0c;照着老教程改/etc/rc.local#xff0c;结果发现文件压根不存在#xff1f;或者改完之后脚本根本不执行#xff1f;别急#xff0c…Ubuntu 16.04以后版本怎么设自启这里有答案你是不是也遇到过这样的问题在Ubuntu 16.04或更新的系统上照着老教程改/etc/rc.local结果发现文件压根不存在或者改完之后脚本根本不执行别急这不是你的操作错了而是Ubuntu从16.04开始彻底转向了systemd——那个更现代、更严格、也更容易让人困惑的服务管理器。这篇内容不是复述旧方法而是专为你梳理清楚在当前主流Ubuntu18.04/20.04/22.04/24.04上真正可靠、可验证、能落地的开机自启方案。我们用的是真实镜像“测试开机启动脚本”所有步骤都经过实机验证不讲虚的只说你能立刻用上的方法。1. 先搞清一个关键事实rc.local 已成“兼容层”不是首选1.1 为什么老教程在新系统上失效Ubuntu 16.04起默认使用systemd替代传统的SysV init。rc.local虽然被保留但只是作为systemd的一个兼容服务rc-local.service它默认是禁用状态且对脚本权限、执行环境、错误处理都有更严苛的要求。简单说你按老办法写了rc.local系统可能根本不会加载它即使加载了脚本里用到的路径、用户环境、GUI依赖等大概率会静默失败——连报错都不给你看。1.2 那还用rc.local吗可以但必须激活校验如果你坚持用rc.local比如为了快速迁移旧项目请务必完成以下三步缺一不可确保/etc/rc.local文件存在且有执行权限启用并启动rc-local.service在脚本末尾明确写exit 0# 检查rc-local服务状态 sudo systemctl status rc-local # 如果显示disabled或not-found需手动启用 sudo touch /etc/rc.local sudo chmod x /etc/rc.local echo #!/bin/bash | sudo tee /etc/rc.local echo exit 0 | sudo tee -a /etc/rc.local # 启用服务 sudo systemctl enable rc-local sudo systemctl start rc-local # 再次检查状态确认Active: active (exited) sudo systemctl status rc-local注意/etc/rc.local里的命令默认以root身份运行但没有完整的用户环境变量比如$HOME、$DISPLAY、$PATH可能不包含/usr/local/bin。如果你的脚本要启动图形程序或依赖特定路径请显式声明# 在rc.local中这样写才稳妥 su -c /home/user/Documents/scripts/auto_run_test.sh -s /bin/bash user2. 推荐方案用 systemd 服务 —— 真正现代、可控、可调试这才是Ubuntu 16.04的“官方正统”做法。它把启动逻辑变成一个独立服务你可以精确控制启动时机、用户身份、工作目录、失败重试策略还能随时查看日志排错。2.1 创建你的启动脚本保持原样但位置更规范我们沿用你提供的auto_run_test.sh但建议放到更标准的位置/opt/my-startup/# 创建目录并复制脚本 sudo mkdir -p /opt/my-startup sudo cp /home/user/Documents/scripts/auto_run_test.sh /opt/my-startup/ sudo chmod x /opt/my-startup/auto_run_test.sh脚本内容无需修改但注意两点优化建议把相对路径./output.txt改成绝对路径避免因工作目录不确定导致写入失败加上时间戳方便后续排查优化后的脚本示例/opt/my-startup/auto_run_test.sh#!/bin/bash # 记录启动时间 echo [$(date)] helloStartup /opt/my-startup/output.txt # 显式指定工作目录 cd /home/user/mywbc_v5_usb/build || { echo Failed to enter build dir /opt/my-startup/output.txt; exit 1; } echo [$(date)] EnterBuildDir /opt/my-startup/output.txt # 运行程序加后台运行避免阻塞启动 /opt/my-startup/sim/sim echo [$(date)] AfterSim /opt/my-startup/outputend.txt2.2 编写 systemd 服务单元文件在/etc/systemd/system/下创建服务定义文件sudo nano /etc/systemd/system/my-startup.service填入以下内容逐行解释见注释[Unit] DescriptionMy Custom Startup Script Aftermulti-user.target # 确保在网络、文件系统就绪后启动 StartLimitIntervalSec0 # 禁用启动频率限制便于调试 [Service] Typeoneshot # 脚本执行完即退出非长期守护进程 Useruser # 以普通用户user身份运行非root WorkingDirectory/opt/my-startup ExecStart/opt/my-startup/auto_run_test.sh RemainAfterExityes # 即使脚本退出服务状态仍标记为active StandardOutputjournal # 输出日志到systemd journal StandardErrorjournal Restarton-failure # 如果脚本返回非0自动重试可选 [Install] WantedBymulti-user.target2.3 启用并验证服务# 重新加载配置每次修改service文件后必做 sudo systemctl daemon-reload # 启用开机自启 sudo systemctl enable my-startup.service # 立即启动一次测试是否正常 sudo systemctl start my-startup.service # 查看服务状态和实时日志 sudo systemctl status my-startup.service sudo journalctl -u my-startup.service -f如果一切顺利你会看到Active: active (exited)并且/opt/my-startup/output.txt里已写入带时间戳的内容。优势总结以指定用户运行安全可控日志全量记录出错一眼可见启动顺序精准可控After支持失败自动恢复Restart与系统其他服务统一管理无兼容性风险3. 图形界面程序怎么办别用rc.local用桌面自动启动如果你的脚本最终要打开一个GUI窗口比如启动浏览器、显示通知、运行Qt程序rc.local和systemd服务默认无GUI环境都会失败。正确做法是利用桌面环境自身的启动机制。3.1 GNOME / Ubuntu Desktop 用户用 .desktop 文件在用户主目录的自动启动目录下创建.desktop文件mkdir -p ~/.config/autostart nano ~/.config/autostart/my-gui-app.desktop内容如下关键字段说明见注释[Desktop Entry] TypeApplication NameMy GUI App Starter CommentLaunch my app after login Exec/opt/my-startup/auto_run_test.sh Iconutilities-terminal X-GNOME-Autostart-enabledtrue # 延迟3秒启动确保桌面环境完全就绪 X-GNOME-Autostart-Delay3保存后下次登录GNOME桌面时脚本就会自动执行。注意此方式仅在用户图形登录后触发不是系统级开机即启。3.2 验证是否生效注销再登录或者直接运行gtk-launch my-gui-app.desktop测试脚本能否执行查看输出文件或终端日志确认效果4. 常见问题与避坑指南来自真实踩坑经验4.1 “脚本执行了但程序没起来” —— 环境变量缺失systemd服务默认环境极简$PATH只有/usr/bin:/bin。如果你的程序在/home/user/bin或/opt/myapp/bin必须显式指定# 在my-startup.service的[Service]段添加 EnvironmentPATH/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/home/user/bin4.2 “output.txt是空的” —— 工作目录不明确rc.local和systemd服务启动时当前工作目录不一定是你的脚本所在目录。永远用绝对路径❌ 错误echo test ./output.txt正确echo test /opt/my-startup/output.txt4.3 “sim程序一闪而过就没了” —— 后台运行与进程守护如果./sim/sim是前台交互程序systemd会等它退出才结束服务。若你想让它持续运行加后台化并用Typeforking[Service] Typeforking ExecStart/opt/my-startup/sim/sim PIDFile/var/run/my-sim.pid同时在脚本里让程序自己写PID文件或改用Typesimple配合ExecStartPre预处理。4.4 “重启后还是没反应” —— 最终检查清单执行以下命令逐项确认# 1. 服务是否启用 systemctl is-enabled my-startup.service # 2. 服务是否在目标启动级别中 systemctl list-dependencies --reverse multi-user.target | grep my-startup # 3. 最近一次启动的日志 journalctl -u my-startup.service -n 50 --no-pager # 4. 脚本本身有无语法错误 bash -n /opt/my-startup/auto_run_test.sh # 5. 手动执行是否成功 sudo -u user /opt/my-startup/auto_run_test.sh5. 总结选对方法事半功倍Ubuntu 16.04之后的开机自启本质是告别“黑盒式”的rc.local拥抱systemd的显式、可管、可溯哲学。本文为你厘清三条清晰路径rc.local兼容方案仅用于快速过渡必须手动启用服务并严格校验权限与环境systemd服务方案推荐适用于绝大多数后台任务、服务初始化、脚本自动化安全、稳定、易调试桌面自动启动方案专治GUI程序登录即启与用户会话生命周期绑定无论你用的是“测试开机启动脚本”镜像还是自己的生产环境只要按本文步骤操作就能避开90%的常见陷阱。真正的自启不是让脚本跑起来而是让它稳稳地、可预期地、可维护地跑起来。--- **获取更多AI镜像** 想探索更多AI镜像和应用场景访问 [CSDN星图镜像广场](https://ai.csdn.net/?utm_sourcemirror_blog_end)提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

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

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

立即咨询