2026/5/18 17:26:10
网站建设
项目流程
京东网站是自己做的吗,图表生成网站,商标注册网app,flash网站欣赏保姆级教程#xff1a;如何在Ubuntu中设置开机自动运行脚本
你是否曾遇到这样的场景#xff1a;每次重启Ubuntu服务器后#xff0c;都要手动启动监控服务、数据采集脚本或定时任务#xff1f;又或者开发了一个后台工具#xff0c;却总忘记执行./start.sh#xff1f;别再…保姆级教程如何在Ubuntu中设置开机自动运行脚本你是否曾遇到这样的场景每次重启Ubuntu服务器后都要手动启动监控服务、数据采集脚本或定时任务又或者开发了一个后台工具却总忘记执行./start.sh别再重复操作了——让脚本真正“活”起来开机即运行省心又可靠。本文不是泛泛而谈的理论汇总而是一份经过多轮实测验证、覆盖主流Ubuntu版本20.04/22.04/24.04、适配桌面与服务器环境的可落地、零踩坑、一步到位的开机启动实践指南。我们聚焦最稳定、最通用、最易调试的两种方法并明确告诉你哪一种该优先用、哪一种该谨慎试、哪一种可以直接跳过。全文不讲抽象概念只说“你该敲什么命令”“为什么这么写”“出错了怎么一眼定位”。所有步骤均基于真实终端操作截图复现代码可直接复制粘贴注释已为你补全逻辑细节。哪怕你是第一次接触Linux系统管理也能照着做完、立刻生效。1. 方法一使用systemd服务推荐现代Ubuntu首选Ubuntu自15.04起全面转向systemd作为默认初始化系统它比老旧的SysV init更可靠、更灵活、日志更清晰、依赖管理更智能。尤其对需要联网、等待磁盘挂载、或依赖其他服务的脚本systemd是唯一稳妥选择。1.1 创建服务文件打开终端执行以下命令创建服务定义文件以test-startup为例名称可自定义sudo nano /etc/systemd/system/test-startup.service粘贴以下内容请逐行阅读注释理解每项含义[Unit] DescriptionTest Startup Script Service Afternetwork.target multi-user.target Wantsnetwork.target [Service] Typesimple Userubuntu WorkingDirectory/home/ubuntu/trx ExecStart/usr/bin/bash /home/ubuntu/trx/run.sh Restarton-failure RestartSec10 StandardOutputjournal StandardErrorjournal [Install] WantedBymulti-user.target关键参数说明After和Wants确保网络就绪后再启动避免脚本因无网失败User指定以普通用户ubuntu身份运行强烈建议避免root滥用风险WorkingDirectory设定脚本工作路径防止相对路径报错ExecStart必须使用绝对路径调用bash解释器再执行脚本/usr/bin/bash而非/bin/sh兼容更多语法Restart进程意外退出时自动重启提升健壮性StandardOutput将输出重定向至systemd日志便于后续排查注意不要直接写ExecStart/home/ubuntu/trx/run.sh—— 若脚本缺少shebang或权限问题systemd无法识别解释器会静默失败。1.2 编写可执行脚本run.sh进入你的项目目录创建并编辑脚本mkdir -p /home/ubuntu/trx nano /home/ubuntu/trx/run.sh写入以下内容含错误处理与日志记录#!/usr/bin/env bash # 记录启动时间便于验证是否真正执行 echo [$(date)] Script started /home/ubuntu/trx/startup.log # 示例任务检查并启动一个Python服务替换为你自己的命令 if command -v python3 /dev/null; then cd /home/ubuntu/trx # 启动你的实际程序例如 # nohup python3 main.py app.log 21 echo Python is available, proceeding... /home/ubuntu/trx/startup.log else echo [$(date)] ERROR: python3 not found /home/ubuntu/trx/startup.log exit 1 fi # 任务结束标记 echo [$(date)] Script completed successfully /home/ubuntu/trx/startup.log赋予执行权限chmod x /home/ubuntu/trx/run.sh1.3 启用并测试服务刷新systemd配置启用服务并立即启动一次验证sudo systemctl daemon-reload sudo systemctl enable test-startup.service sudo systemctl start test-startup.service检查状态是否正常sudo systemctl status test-startup.service正常输出应包含active (running)和最近的日志行。若显示failed直接查看错误详情sudo journalctl -u test-startup.service -n 20 --no-pager小技巧-n 20显示最近20行--no-pager避免分页阻塞适合快速定位。1.4 卸载服务如需若要彻底移除三步到位sudo systemctl stop test-startup.service sudo systemctl disable test-startup.service sudo rm /etc/systemd/system/test-startup.service sudo systemctl daemon-reload2. 方法二修改/etc/rc.local兼容旧版但有陷阱rc.local是传统SysV风格的启动入口Ubuntu虽保留支持但默认不启用且在某些云镜像或精简系统中已被移除。仅当systemd方案因特殊限制不可用时才考虑此法。2.1 确认rc.local存在且可执行检查文件是否存在并具备执行权限ls -l /etc/rc.local若提示No such file or directory需手动创建sudo nano /etc/rc.local写入标准模板必须包含exit 0否则系统卡在启动界面#!/bin/bash # /etc/rc.local # 你的启动命令放在这里注意必须用绝对路径 /home/ubuntu/trx/run.sh exit 0赋予执行权限sudo chmod x /etc/rc.local2.2 启用rc-local服务关键Ubuntu 20.04必需新版Ubuntu中rc.local默认被禁用。需显式启用对应服务sudo systemctl enable rc-local sudo systemctl start rc-local验证是否激活sudo systemctl status rc-local应显示active (exited)。若为inactive (dead)检查/etc/rc.local末尾是否有exit 0以及文件权限是否为x。2.3 常见失败原因避坑重点❌ 错误脚本中使用sudo或交互式命令如gnome-terminal正解rc.local以root身份运行无需sudo图形界面命令在此无效无DISPLAY环境❌ 错误路径使用~或相对路径如./run.sh正解全部使用绝对路径如/home/ubuntu/trx/run.sh❌ 错误脚本本身未加#!/bin/bash或权限不足正解先手动执行/home/ubuntu/trx/run.sh确认无报错再加入rc.local提示此方法日志不统一调试困难。建议仅用于极简场景如挂载硬盘、设置内核参数复杂脚本务必用systemd。3. 方法三桌面环境自启动仅限GUI用户如果你使用的是带图形界面的Ubuntu如GNOME且脚本需与用户会话绑定例如启动托盘程序、自动打开浏览器可采用此法。服务器环境请忽略此项。3.1 使用Startup Applications GUI最简单打开“启动应用程序”Startup Applications点击“添加” → 输入名称如My Script在“命令”栏填写/usr/bin/bash -c /home/ubuntu/trx/run.sh保存即可优势无需命令行图形化操作用户登录即触发局限仅对当前用户生效且依赖桌面会话非系统级启动3.2 手动创建.desktop文件更可控创建启动描述文件nano ~/.config/autostart/my-script.desktop内容如下[Desktop Entry] TypeApplication NameMy Startup Script Exec/usr/bin/bash -c /home/ubuntu/trx/run.sh Hiddenfalse NoDisplayfalse X-GNOME-Autostart-enabledtrue保存后下次登录即生效。此方式支持延迟启动、条件判断等高级功能。4. 调试与排错实战指南无论采用哪种方法启动失败都不可怕——关键是快速定位。以下是高频问题与速查清单4.1 通用检查流程检查项命令/操作说明脚本能否手动运行bash /home/ubuntu/trx/run.sh先排除脚本自身逻辑错误权限是否正确ls -l /home/ubuntu/trx/run.sh必须含x执行位-rwxr-xr-x路径是否绝对检查所有cd、python、curl等命令路径which python3确认二进制位置环境变量是否缺失在脚本开头添加env /tmp/env.log对比手动执行与开机执行的环境差异4.2 systemd专属排错命令# 查看服务完整日志含启动全过程 sudo journalctl -u test-startup.service -b # 实时跟踪日志类似tail -f sudo journalctl -u test-startup.service -f # 查看服务依赖关系确认network是否ready sudo systemctl list-dependencies test-startup.service --reverse4.3 rc.local排错要点检查/var/log/syslog中是否有rc.local相关报错在/etc/rc.local中添加临时日志echo [$(date)] rc.local executed /var/log/rclocal.log确保/etc/systemd/system/multi-user.target.wants/rc-local.service存在5. 总结选对方法事半功倍回顾三种方式的本质差异与适用边界** systemd服务首选**面向生产环境支持依赖管理、自动重启、结构化日志是Ubuntu官方推荐方案。适用于95%的后台脚本、守护进程、自动化任务。** rc.local备选**仅用于兼容遗留脚本或极简需求调试成本高不推荐新项目采用。 桌面自启动限定场景纯GUI交互类应用专用与系统启动无关勿与前两者混淆。最后强调三个黄金原则永远用绝对路径——这是跨环境稳定的基石先手动验证再设开机——避免重启后无法登录的尴尬日志是你的第一双眼睛——善用journalctl和脚本内echo故障定位效率提升3倍以上。现在你可以自信地重启系统然后泡杯咖啡等待终端里那行active (running)静静浮现——真正的自动化就该如此安静而可靠。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。