news 2026/3/4 2:34:06

开机自动切换目录+执行程序,一气呵成

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
开机自动切换目录+执行程序,一气呵成

开机自动切换目录+执行程序,一气呵成

你有没有遇到过这样的场景:每天开机后都要重复做几件事——先切到项目目录,再启动某个服务或仿真程序,最后还要确认它跑起来了?手动操作不仅费时,还容易出错。更糟的是,如果程序需要在后台稳定运行,每次重启系统都得重新来一遍。

其实,Linux系统早就为我们准备好了成熟的解决方案:让系统在启动完成时,自动帮你完成这一整套操作。本文不讲复杂原理,只聚焦一件事——如何让Ubuntu系统开机后自动切换到指定目录,并立即执行你的程序。整个过程清晰、可靠、可验证,小白也能一次搞定。

我们用一个真实案例贯穿全文:假设你有一个USB设备仿真项目,编译产物在/home/user/mywbc_v5_usb/build目录下,主程序是./sim/sim,你希望每次开机就自动进入该目录并运行它,同时留下日志便于确认是否成功。下面就是完整落地步骤。

1. 编写可执行的启动脚本

脚本是整个流程的“大脑”,它负责把你要做的所有事按顺序写清楚。关键在于:它必须能独立运行,且路径要写死(不能用~或相对路径)

1.1 创建脚本文件

推荐放在一个固定、易管理的位置,比如/home/yourname/scripts/(请将yourname替换成你实际的用户名):

mkdir -p /home/yourname/scripts nano /home/yourname/scripts/auto_start_sim.sh

注意:不要用Documents或带空格的路径,避免后续出错;也不要用sudo nano直接编辑用户目录下的文件,权限容易混乱。

1.2 写入脚本内容

将以下内容完整复制进去(注意替换yourname为你的用户名):

#!/bin/bash # 记录启动时间,方便排查 echo "[$(date '+%Y-%m-%d %H:%M:%S')] System boot start" > /home/yourname/scripts/startup.log # 切换到目标工作目录(绝对路径!) cd /home/yourname/mywbc_v5_usb/build # 检查目录是否存在,避免静默失败 if [ ! -d "/home/yourname/mywbc_v5_usb/build" ]; then echo "[$(date '+%Y-%m-%d %H:%M:%S')] ERROR: Build directory not found!" >> /home/yourname/scripts/startup.log exit 1 fi # 检查可执行文件是否存在 if [ ! -x "./sim/sim" ]; then echo "[$(date '+%Y-%m-%d %H:%M:%S')] ERROR: ./sim/sim is not executable or missing!" >> /home/yourname/scripts/startup.log exit 1 fi # 启动程序(后台运行,不阻塞系统启动) nohup ./sim/sim > /home/yourname/scripts/sim_output.log 2>&1 & # 记录PID,便于后续管理(可选) echo "[$(date '+%Y-%m-%d %H:%M:%S')] SIM started with PID $!" >> /home/yourname/scripts/startup.log

1.3 关键点说明

  • #!/bin/bash是必须的“解释器声明”,告诉系统用bash来运行它;
  • 所有路径都使用绝对路径~.在系统级启动时不可靠;
  • nohup ... &让程序在后台持续运行,即使终端关闭也不退出;
  • >>2>&1把标准输出和错误都重定向到日志,方便排障;
  • 加了存在性检查,脚本不会因为路径或文件缺失而“假装成功”;
  • 日志里带时间戳,一眼就能看出哪次启动出了问题。

2. 设置脚本执行权限

Linux默认不允许脚本直接执行,必须显式赋予权限:

chmod +x /home/yourname/scripts/auto_start_sim.sh

推荐用chmod +x而非chmod 777。后者开放所有权限,存在安全风险;+x只添加执行权限,更精准、更安全。

验证是否生效:

ls -l /home/yourname/scripts/auto_start_sim.sh

如果看到-rwxr--r--或类似显示中包含x,说明权限已正确设置。

3. 选择可靠的启动注入方式

Ubuntu不同版本对传统rc.local的支持差异较大。20.04及更新版本默认禁用rc.local,强行启用反而容易引发启动卡顿或失败。因此,我们采用更现代、更稳定的方式:systemd用户服务

它有三大优势:

  • 不依赖root权限,完全在用户空间运行;
  • 自动处理工作目录、环境变量和依赖关系;
  • 支持日志查看、状态监控、失败自动重试等高级功能。

3.1 创建用户级service文件

mkdir -p ~/.config/systemd/user nano ~/.config/systemd/user/auto-start-sim.service

写入以下内容(同样替换yourname):

[Unit] Description=Auto-start WBC USB Simulation After=network.target [Service] Type=simple WorkingDirectory=/home/yourname/mywbc_v5_usb/build ExecStart=/home/yourname/scripts/auto_start_sim.sh Restart=on-failure RestartSec=10 StandardOutput=append:/home/yourname/scripts/service.log StandardError=append:/home/yourname/scripts/service.log [Install] WantedBy=default.target

3.2 启用并启动服务

# 通知systemd重新加载配置 systemctl --user daemon-reload # 开机自启(关键命令) systemctl --user enable auto-start-sim.service # 立即启动一次,测试是否正常 systemctl --user start auto-start-sim.service

3.3 验证服务状态

systemctl --user status auto-start-sim.service

正常输出应包含active (running)active (exited),且没有红色的failed字样。如果有报错,用以下命令查看详细日志:

journalctl --user -u auto-start-sim.service -n 20 --no-pager

4. 常见问题与避坑指南

即使步骤正确,实际部署中仍可能遇到几个典型问题。以下是真实踩坑总结,帮你绕开90%的失败。

4.1 “程序没起来”?先查环境变量

GUI桌面环境和systemd服务的环境变量不同。你的程序如果依赖PATH中的某些工具(如python3gcc),可能找不到。解决方法是在service文件的[Service]段添加:

Environment="PATH=/usr/local/bin:/usr/bin:/bin"

或者更彻底地,在脚本开头显式设置:

export PATH="/usr/local/bin:/usr/bin:/bin:$PATH"

4.2 “目录切换失败”?确认路径拼写和权限

  • ls -ld /home/yourname/mywbc_v5_usb/build检查目录是否存在、权限是否允许当前用户进入(需有x权限);
  • cd命令后务必加判断,如前文脚本所示,避免后续命令全部静默失败。

4.3 “日志为空”?检查重定向是否生效

  • nohup必须配合&使用,否则会阻塞;
  • >是覆盖写入,>>是追加写入,建议统一用>>
  • 确保日志路径所在目录存在且可写:mkdir -p /home/yourname/scripts

4.4 Ubuntu 16.04/18.04 用户:rc.local仍可用,但需激活

如果你坚持用rc.local(例如嵌入式场景),请按以下步骤:

# 1. 创建rc.local文件(如果不存在) sudo nano /etc/rc.local # 2. 写入内容(注意:必须以#!/bin/sh开头,且最后一行是exit 0) #!/bin/sh -e # # rc.local # cd /home/yourname/scripts ./auto_start_sim.sh exit 0 # 3. 赋予执行权限 sudo chmod +x /etc/rc.local # 4. 启用服务(Ubuntu 16.04+) sudo systemctl enable rc-local

注意:rc.local在systemd环境下本质是作为一个兼容服务运行的,不如原生systemd service稳定,仅作备选。

5. 进阶技巧:让启动更智能、更可控

基础功能实现后,你可以轻松叠加这些实用能力,让自动化真正服务于开发流程。

5.1 启动前检查USB设备是否就位

很多仿真程序依赖特定USB设备。可以在脚本开头加入检测逻辑:

# 检查USB设备(以VID:PID为例,用lsusb查看实际值) if ! lsusb | grep -q "0403:6001"; then echo "[$(date)] ERROR: USB device not found!" >> /home/yourname/scripts/startup.log exit 1 fi

5.2 启动后发送桌面通知(仅限GUI环境)

如果你在桌面环境下使用,可以加一句提示:

# 在脚本末尾添加(需安装libnotify-bin) sudo -u yourname DISPLAY=:0 DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$(id -u)/bus notify-send "SIM Started" "Simulation is now running in background."

5.3 一键管理:启停重启脚本

创建一个快捷管理脚本/home/yourname/scripts/sim-ctl.sh

#!/bin/bash case "$1" in start) systemctl --user start auto-start-sim.service ;; stop) systemctl --user stop auto-start-sim.service ;; restart) systemctl --user restart auto-start-sim.service ;; status) systemctl --user status auto-start-sim.service ;; logs) journalctl --user -u auto-start-sim.service -n 50 --no-pager ;; *) echo "Usage: $0 {start|stop|restart|status|logs}" ;; esac

然后chmod +x,以后只需./sim-ctl.sh status就能快速掌握状态。

6. 总结

从“每天手动切目录、敲命令”到“开机即用、全程静默”,这个转变并不需要高深知识,只需要理解三个核心要点:

  • 脚本要健壮:用绝对路径、加存在性检查、记详细日志;
  • 启动要可靠:优先选用systemd用户服务,它比rc.local更现代、更可控;
  • 验证要及时:别等重启完才发现失败,先用systemctl --user start本地测试。

你不需要记住所有命令,只要保存好这篇文档里的模板脚本和服务文件,下次遇到类似需求,改几处路径、加两行业务逻辑,5分钟就能复用。

自动化真正的价值,不在于炫技,而在于把人从重复劳动中解放出来,去思考更关键的问题——比如,你的仿真程序下一步还能优化哪些指标?


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/24 21:34:48

7步打造精准压枪:罗技鼠标宏高级配置与全场景应用指南

7步打造精准压枪:罗技鼠标宏高级配置与全场景应用指南 【免费下载链接】logitech-pubg PUBG no recoil script for Logitech gaming mouse / 绝地求生 罗技 鼠标宏 项目地址: https://gitcode.com/gh_mirrors/lo/logitech-pubg 一、如何诊断设备兼容性问题&a…

作者头像 李华
网站建设 2026/3/1 12:38:31

NBTExplorer:Minecraft数据编辑的全能型解决方案

NBTExplorer:Minecraft数据编辑的全能型解决方案 【免费下载链接】NBTExplorer A graphical NBT editor for all Minecraft NBT data sources 项目地址: https://gitcode.com/gh_mirrors/nb/NBTExplorer NBTExplorer是一款专为Minecraft设计的开源图形化NBT编…

作者头像 李华
网站建设 2026/3/1 14:11:21

3款视觉大模型部署体验:Glyph镜像免配置优势凸显

3款视觉大模型部署体验:Glyph镜像免配置优势凸显 1. 视觉推理新思路:Glyph为何与众不同 最近在测试几款主流视觉大模型时,Glyph 给我留下了最深的印象——不是因为它生成的图片最炫,也不是因为参数量最大,而是它用一…

作者头像 李华
网站建设 2026/3/3 13:50:13

高效数据提取工具:结构化导出与高效管理指南

高效数据提取工具:结构化导出与高效管理指南 【免费下载链接】XHS-Downloader 免费;轻量;开源,基于 AIOHTTP 模块实现的小红书图文/视频作品采集工具 项目地址: https://gitcode.com/gh_mirrors/xh/XHS-Downloader 在当今数…

作者头像 李华
网站建设 2026/2/24 16:02:51

Z-Image-Turbo模型文件太大?这个镜像直接内置免下载

Z-Image-Turbo模型文件太大?这个镜像直接内置免下载 你是不是也经历过这样的尴尬: 想试试最近爆火的Z-Image-Turbo——那个号称“8步出图、照片级真实感、中英双语都稳”的开源文生图模型,结果刚点开GitHub仓库,就看到一行醒目的…

作者头像 李华