开机自动进入指定目录并执行程序,实操教程
1. 为什么需要开机自动执行脚本
你有没有遇到过这样的情况:每次开机后都要手动打开终端、切换到项目目录、再运行程序?特别是做嵌入式开发、仿真测试或者部署服务时,重复操作既耗时又容易出错。比如你正在调试一个USB设备模拟器,每次都要进/home/user/mywbc_v5_usb/build目录,再执行./sim/sim——这个过程完全可以自动化。
本文要解决的就是这个问题:让系统在启动完成后,自动进入你指定的目录,并执行你想要的程序。整个过程不需要人工干预,开机即用。我们以Ubuntu系统为例,提供两种稳定可靠的方法,一种是传统rc.local方式,另一种是通用性更强的profile方案,适合不同版本的系统。
整个教程不涉及复杂配置,所有操作都基于命令行完成,每一步都有明确说明和可验证结果。即使你是Linux新手,也能照着操作顺利完成。
2. 方法一:通过rc.local实现开机自启(推荐用于Ubuntu 16.04–20.04)
2.1 创建可执行脚本文件
首先,我们需要准备一个shell脚本,它将负责切换目录并运行目标程序。建议把脚本放在一个固定位置,比如你的文档目录下。
打开终端,执行以下命令创建脚本目录和文件:
mkdir -p ~/Documents/scripts nano ~/Documents/scripts/auto_run_test.sh在编辑器中输入以下内容(注意:复制时请确保符号为英文格式):
#!/bin/bash # 记录启动日志 echo "[$(date)] Startup triggered" > ~/Documents/scripts/output.txt # 进入指定工作目录 cd /home/user/mywbc_v5_usb/build # 再次记录日志,确认已进入正确路径 echo "[$(date)] Entered build directory" >> ~/Documents/scripts/output.txt # 执行目标程序(此处为模拟器) if [ -f "./sim/sim" ]; then echo "[$(date)] Starting simulator..." >> ~/Documents/scripts/output.txt ./sim/sim & echo "[$(date)] Simulator launched in background" >> ~/Documents/scripts/output.txt else echo "[$(date)] ERROR: ./sim/sim not found!" >> ~/Documents/scripts/output.txt fi这段脚本做了几件关键的事:
- 使用
$(date)添加时间戳,方便后续排查问题 - 把所有日志写入
output.txt,便于验证是否成功执行 - 检查
./sim/sim是否存在,避免因路径错误导致静默失败 - 使用
&让程序后台运行,防止阻塞系统启动流程
保存并退出(nano中按Ctrl+O → Enter → Ctrl+X)。
2.2 设置脚本执行权限
Linux默认不允许直接运行.sh文件,必须赋予执行权限:
chmod +x ~/Documents/scripts/auto_run_test.sh这里使用+x比777更安全,只添加执行权限,不开放读写权限给所有人。
验证是否设置成功:
ls -l ~/Documents/scripts/auto_run_test.sh如果看到最前面有-rwxr-xr-x,说明权限已生效(其中x表示可执行)。
2.3 启用并配置rc.local服务
在较老版本的Ubuntu(如16.04、18.04)中,rc.local是标准的开机自启入口。但新版本默认禁用该服务,需手动启用。
先检查rc.local文件是否存在:
ls -l /etc/rc.local如果提示“没有那个文件”,则手动创建:
sudo nano /etc/rc.local输入以下标准模板内容:
#!/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. # Add your commands here cd /home/user/Documents/scripts ./auto_run_test.sh exit 0特别注意:
- 第一行
#!/bin/sh -e必须保留,这是shell解释器声明 cd命令必须写全路径,不能用~- 最后的
exit 0必不可少,否则系统可能卡在启动阶段
保存后,设置rc.local可执行:
sudo chmod +x /etc/rc.local最后启用rc-local服务(Ubuntu 18.04+必需):
sudo systemctl enable rc-local sudo systemctl start rc-local检查服务状态:
sudo systemctl status rc-local如果看到active (exited),说明配置成功。
3. 方法二:通过/etc/profile实现(兼容性更强,适用于无rc.local的系统)
3.1 什么情况下选择此方法
如果你使用的是Ubuntu 22.04或更新版本,或者执行ls /etc/rc.local发现文件不存在,那么rc.local很可能已被移除。此时推荐使用/etc/profile方案——它在每次用户登录时都会执行,对桌面环境和SSH登录均有效。
注意:此方法适用于图形界面登录或终端登录后自动触发,不是严格意义上的“系统级开机启动”,但对于绝大多数开发和测试场景完全够用。
3.2 修改profile文件
使用管理员权限编辑全局profile:
sudo nano /etc/profile滚动到底部,在最后一行之前添加以下内容:
# Auto-run script for development environment if [ -f "/home/user/Documents/scripts/auto_run_test.sh" ] && [ "$(tty)" = "/dev/tty1" ]; then cd /home/user/Documents/scripts ./auto_run_test.sh > /dev/null 2>&1 & fi这段逻辑的意思是:
- 先检查脚本文件是否存在
- 再判断当前是否为图形界面的第一个终端(tty1),避免在其他终端窗口重复执行
- 后台静默运行脚本,不占用终端界面
保存退出后,该配置将在下次登录时生效。
如果你想立即测试(无需重启),可以手动加载profile:
source /etc/profile但注意:这仅对当前终端有效,真正验证仍需重启或重新登录。
4. 验证与排错指南
4.1 如何确认脚本已执行
最简单的方式是检查日志文件:
cat ~/Documents/scripts/output.txt正常情况下,你会看到类似这样的内容:
[Wed 10 Apr 2024 09:23:15 AM CST] Startup triggered [Wed 10 Apr 2024 09:23:15 AM CST] Entered build directory [Wed 10 Apr 2024 09:23:15 AM CST] Starting simulator... [Wed 10 Apr 2024 09:23:15 AM CST] Simulator launched in background如果文件为空或只有第一行,说明脚本未被调用,需要检查以下几点:
- 脚本路径是否拼写正确(尤其注意
/home/user/中的用户名是否准确) rc.local或profile中调用的路径是否与实际一致- 目标程序
./sim/sim是否存在且具有执行权限(可用ls -l ./sim/sim确认)
4.2 常见问题及解决方案
| 问题现象 | 可能原因 | 解决方法 |
|---|---|---|
| output.txt只有第一行 | 脚本未执行到cd之后 | 检查rc.local或profile中路径是否正确;确认exit 0是否遗漏 |
| 提示“Permission denied” | 脚本缺少执行权限 | 运行chmod +x 脚本路径 |
| 提示“No such file or directory” | 目标程序路径错误 | 进入/home/user/mywbc_v5_usb/build目录,执行ls ./sim/确认文件存在 |
| 图形界面启动后无反应 | profile方案未匹配tty1 | 尝试去掉tty判断条件,或改用~/.bashrc(仅限当前用户) |
如果你只想对当前用户生效(更安全),可以把脚本调用写入~/.bashrc末尾:
echo 'cd /home/user/mywbc_v5_usb/build && ./sim/sim &' >> ~/.bashrc这样每次打开新终端都会自动运行,适合日常开发调试。
5. 进阶技巧:让程序保持运行并监控状态
单纯启动程序还不够,有时我们需要确保它持续运行。比如你的模拟器意外崩溃后,希望能自动重启。
可以在原脚本中加入循环守护逻辑:
#!/bin/bash while true; do echo "[$(date)] Starting simulator..." >> ~/Documents/scripts/output.txt cd /home/user/mywbc_v5_usb/build if [ -f "./sim/sim" ]; then ./sim/sim echo "[$(date)] Simulator exited, restarting in 3 seconds..." >> ~/Documents/scripts/output.txt sleep 3 else echo "[$(date)] ERROR: Simulator binary missing!" >> ~/Documents/scripts/output.txt break fi done这个版本会在程序退出后等待3秒,然后自动重启,形成一个简单的守护进程。当然,生产环境建议使用systemd服务管理,但对测试用途来说,这个轻量方案足够实用。
另一个实用技巧是添加PID文件,避免重复启动:
PID_FILE="/tmp/sim.pid" if [ -f "$PID_FILE" ] && kill -0 $(cat $PID_FILE) > /dev/null 2>&1; then echo "[$(date)] Simulator already running" >> ~/Documents/scripts/output.txt exit 0 fi ./sim/sim & echo $! > "$PID_FILE"这样即使脚本被多次调用,也不会启动多个实例。
6. 总结
本文完整演示了如何让Ubuntu系统在开机或登录后,自动进入指定目录并执行程序。我们提供了两种主流方案:
- rc.local方式:适用于Ubuntu 16.04–20.04,属于系统级启动,适合服务类应用
- profile方式:兼容性更好,适用于22.04及以上版本,更适合开发测试场景
无论选择哪种方式,核心思路都是三步:写脚本 → 设权限 → 加入口。过程中特别要注意路径的绝对性、权限的合理性、以及错误处理的完整性。
你不需要记住所有命令,只需理解每个步骤的目的:脚本定义“做什么”,权限决定“能不能做”,配置文件决定“什么时候做”。掌握这个逻辑,以后遇到类似需求(比如开机启动Web服务器、自动挂载硬盘、定时同步数据),都能举一反三。
现在,你可以关掉这篇教程,打开终端,花5分钟把脚本跑起来——从此告别重复操作,让机器真正为你工作。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。