2026/2/6 14:13:40
网站建设
项目流程
教学网站开发应指导方案,百度推广登录,包头建网站公司哪家强,做彩票网站怎么样告别每次手动执行#xff01;让脚本随系统自动启动
你是否也经历过这样的场景#xff1a;每天开机后第一件事就是打开终端#xff0c;cd到项目目录#xff0c;输入./start.sh#xff0c;再等几秒看日志滚动#xff1f;重复操作不仅耗时#xff0c;还容易遗漏——尤其当…告别每次手动执行让脚本随系统自动启动你是否也经历过这样的场景每天开机后第一件事就是打开终端cd到项目目录输入./start.sh再等几秒看日志滚动重复操作不仅耗时还容易遗漏——尤其当你需要在无人值守的服务器、边缘设备或开发板上长期运行某个服务时手动启动根本不可靠。其实Linux系统早已为我们准备好了成熟的自动化方案。本文不讲抽象概念不堆砌术语只聚焦一件事如何让一个普通Shell脚本在系统启动完成后自动、稳定、可靠地跑起来。我们用最常见、最稳妥的方式带你从零完成配置全程可复制、可验证、无坑可踩。无论你是刚接触Linux的新手还是需要快速部署测试环境的开发者只要你会写基础Shell命令就能跟着本文一步到位。不需要理解systemd的完整架构也不用研究init进程的演进历史——我们要的是今天下午就能用上的解决方案。1. 先写一个真正能干活的脚本很多教程一上来就教改配置文件结果脚本本身就有问题权限不对、路径错误、缺少退出码……最后排查半天才发现是脚本没跑通。所以第一步我们先确保脚本本身是“健康”的。1.1 创建脚本文件推荐将脚本放在一个固定、易管理的位置比如/opt/scripts/系统级脚本常用路径或~/bin/用户级。这里以/opt/scripts/为例sudo mkdir -p /opt/scripts sudo nano /opt/scripts/auto_run_test.sh注意不要用~或相对路径如./script.sh在系统级启动中因为启动时当前工作目录不确定~可能无法展开。在编辑器中输入以下内容请逐字复制注意符号全为英文#!/bin/bash # 记录启动时间用于验证是否真正在开机时执行 echo [$(date %Y-%m-%d %H:%M:%S)] System startup triggered /tmp/startup_log.txt # 进入你的实际工作目录示例路径请按需修改 cd /home/user/mywbc_v5_usb/build || { echo Failed to enter build directory /tmp/startup_log.txt exit 1 } # 执行你的核心程序此处为 ./sim/sim保持原样 if ./sim/sim; then echo [$(date %Y-%m-%d %H:%M:%S)] Simulation completed successfully /tmp/startup_log.txt else echo [$(date %Y-%m-%d %H:%M:%S)] Simulation failed with exit code $? /tmp/startup_log.txt fi这段脚本做了三件关键事用绝对路径记录日志到/tmp/startup_log.txt/tmp在所有Linux发行版中都存在且可写使用cd ... || { ... }结构确保目录切换失败时有明确反馈并退出检查./sim/sim的执行结果成功或失败都记入日志便于后续排查1.2 设置执行权限脚本不是文本文件它必须被系统识别为“可执行程序”。这一步不能跳过sudo chmod x /opt/scripts/auto_run_test.shx比777更安全、更精准——它只赋予执行权限不开放读写权限给所有人。777是典型的安全隐患在生产环境中应严格避免。验证是否生效/opt/scripts/auto_run_test.sh cat /tmp/startup_log.txt如果看到带时间戳的日志输出说明脚本本身完全正常。2. 选择最适合的启动机制rc.local 还是 systemdUbuntu 16.04 及更早版本默认使用rc.local而 Ubuntu 18.04 及以后版本包括主流的 20.04、22.04、24.04已全面转向systemd。盲目套用旧教程很可能在新系统上“配置写了但脚本根本不执行”。我们不假设你的系统版本而是提供双路径方案先检测再选择一次搞定。2.1 快速判断你的系统是否支持 rc.local运行以下命令ls /etc/rc.local如果返回/etc/rc.local说明系统保留了该机制常见于 Ubuntu 16.04、18.04 初期如果提示No such file or directory说明系统已移除rc.localUbuntu 20.04 默认行为。注意即使文件存在也可能被 systemd 禁用。我们后面会统一验证。2.2 方案一启用并配置 rc.local适用于保留该机制的系统如果上一步确认/etc/rc.local存在继续执行# 确保文件可写 sudo chmod 644 /etc/rc.local # 编辑文件 sudo nano /etc/rc.local将你的脚本调用行添加到exit 0之前注意必须在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. # 添加以下两行 cd /opt/scripts ./auto_run_test.sh exit 0保存退出后必须启用 rc-local 服务Ubuntu 18.04 即使有文件也默认禁用sudo systemctl enable rc-local sudo systemctl start rc-local检查状态sudo systemctl status rc-local若显示active (exited)说明已成功启用。2.3 方案二使用 systemd 服务推荐适用于所有现代 Ubuntu这是目前最标准、最可靠、最易维护的方式。我们创建一个专属的服务单元文件sudo nano /etc/systemd/system/auto-run-test.service填入以下内容请逐字复制注意缩进和空格[Unit] DescriptionAuto-run test script at boot Aftermulti-user.target Wantsmulti-user.target [Service] Typeoneshot ExecStart/opt/scripts/auto_run_test.sh RemainAfterExityes Useruser WorkingDirectory/opt/scripts [Install] WantedBymulti-user.target参数说明Typeoneshot表示脚本执行完即退出适合一次性任务RemainAfterExityes让服务状态保持“active”便于用systemctl status查看结果Useruser务必替换成你实际的用户名如ubuntu、dev不能写root除非脚本必须 root 权限WorkingDirectory显式指定工作目录避免因路径问题导致脚本失败。保存后启用并启动服务sudo systemctl daemon-reload sudo systemctl enable auto-run-test.service sudo systemctl start auto-run-test.service验证是否生效sudo systemctl status auto-run-test.service正常应显示active (exited)且日志中能看到你脚本的输出。3. 验证与排错别让“以为成功”耽误你时间配置完成不等于万事大吉。真正的验证必须在重启后进行。但在此之前我们可以做几项快速检查大幅降低失败概率。3.1 三步自查清单重启前必做检查项命令预期结果不通过怎么办脚本是否可执行ls -l /opt/scripts/auto_run_test.sh显示-rwxr-xr-x或类似含x的权限sudo chmod x /opt/scripts/auto_run_test.sh脚本能否手动运行/opt/scripts/auto_run_test.sh cat /tmp/startup_log.txt日志中有时间戳和成功信息检查脚本内路径、权限、依赖是否缺失服务/脚本是否启用sudo systemctl is-enabled auto-run-test.servicesystemdsudo systemctl is-enabled rc-localrc.local返回enabledsudo systemctl enable xxx3.2 重启后如何确认真的成功重启后第一时间执行# 查看日志最直接证据 cat /tmp/startup_log.txt # 查看服务状态systemd 方案 sudo systemctl status auto-run-test.service # 查看 rc.local 执行痕迹rc.local 方案 sudo journalctl -u rc-local --no-pager -n 20如果日志里有你脚本输出的时间戳且服务状态为active恭喜你已经成功了。3.3 常见失败原因与修复建议问题日志为空服务显示failed→ 检查/opt/scripts/auto_run_test.sh中的cd目录是否存在./sim/sim文件是否有执行权限用ls -l /home/user/mywbc_v5_usb/build/确认。问题服务状态为inactive但手动start可以→ 很可能是User设置错误。systemd服务默认以 root 运行但你的程序可能依赖用户环境变量如$HOME、$DISPLAY。此时应改为Useruser并确保该用户已登录过图形界面或改用TypesimpleLoginSessiontrue进阶需求本文不展开。问题rc.local 配置后无反应→ Ubuntu 20.04 默认禁用。务必执行sudo systemctl enable rc-local并确认/etc/rc.local文件开头有#!/bin/sh -e结尾有exit 0。4. 进阶建议让自动启动更健壮、更可控生产环境或长期运行场景下仅“能启动”还不够。以下是几个提升稳定性的实用技巧无需复杂配置一行命令即可生效。4.1 加入延迟启动避开资源竞争某些脚本依赖网络、USB设备或GPU驱动而这些组件在系统启动早期可能尚未就绪。简单加个等待即可# 在 auto_run_test.sh 开头加入等待10秒 sleep 10或者更智能地等待特定条件例如等待 USB 设备出现# 等待 /dev/ttyUSB0 出现最多等 60 秒 for i in $(seq 1 60); do if [ -c /dev/ttyUSB0 ]; then break fi sleep 1 done4.2 重定向所有输出到独立日志避免干扰把echo和程序输出统一归档方便追踪# 替换脚本中的 echo 行为全部导向一个日志 exec /var/log/auto-run-test.log 21 echo [$(date)] Script started记得提前创建日志目录并赋权sudo mkdir -p /var/log/auto-run-test sudo chown user:user /var/log/auto-run-test.log4.3 设置失败自动重试仅 systemd在auto-run-test.service的[Service]段落中添加Restarton-failure RestartSec10 StartLimitIntervalSec600 StartLimitBurst3含义当脚本退出码非0时等待10秒后重试10分钟内最多重试3次。这对网络依赖型脚本非常有用。5. 总结你已经掌握了一项关键运维能力回顾一下我们完成了什么写出一个结构清晰、自带日志、可独立验证的启动脚本根据系统版本选择了rc.local或systemd两种主流方案并完成配置掌握了重启前的三步自查法大幅降低配置失败率学会了查看日志、分析状态、定位常见问题的实操方法获取了延迟启动、日志分离、失败重试等进阶技巧让自动化真正可靠。这不是一个“照着做就能用”的模板而是一套可迁移的方法论。下次你需要让 Python 服务、Node.js 应用、或者 Docker 容器开机自启思路完全一致写好执行单元 → 选对启动机制 → 验证日志输出 → 持续优化健壮性。自动化真正的价值不在于省下那几十秒点击而在于把确定性交给机器把创造力留给自己。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。