开机自动进入指定目录并执行程序,实操教程
2026/6/17 5:40:41 网站建设 项目流程

开机自动进入指定目录并执行程序,实操教程

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

这里使用+x777更安全,只添加执行权限,不开放读写权限给所有人。

验证是否设置成功:

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.localprofile中调用的路径是否与实际一致
  • 目标程序./sim/sim是否存在且具有执行权限(可用ls -l ./sim/sim确认)

4.2 常见问题及解决方案

问题现象可能原因解决方法
output.txt只有第一行脚本未执行到cd之后检查rc.localprofile中路径是否正确;确认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星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

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

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

立即咨询