news 2026/2/3 2:19:38

想让程序开机自动跑?这个脚本方法最适合小白

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
想让程序开机自动跑?这个脚本方法最适合小白

想让程序开机自动跑?这个脚本方法最适合小白

你是不是也遇到过这样的情况:写好了一个监控脚本、一个数据采集程序,或者一个AI服务端口监听器,每次重启电脑后都要手动打开终端、cd到目录、再敲一遍命令?重复操作十次不烦,一百次就崩溃了。更别说万一忘记运行,整个自动化流程就断掉了。

其实,让程序在开机时自动启动,并不需要懂复杂的系统服务配置,也不用研究systemd的unit文件语法。对大多数日常使用场景来说,有一个方法既稳定又简单——用系统自带的启动机制,配合一个普通shell脚本。它不依赖额外工具,不修改核心配置逻辑,出问题也能快速回退,特别适合刚接触Linux的小白用户。

这篇文章就带你从零开始,用最直白的方式,把你的程序变成“开机就干活”的可靠助手。全程不需要安装任何新软件,所有操作都在终端里几条命令搞定,每一步都附带说明和避坑提示。哪怕你只用过Ubuntu桌面版、连vi都不会,也能照着做完。

1. 先搞清楚:我们要做什么,以及为什么选这个方法

1.1 一句话说清目标

我们要实现的是:每次电脑启动进入桌面(或登录终端)后,自动执行你指定的一个.sh脚本,从而启动你的程序

注意,这里不是指“系统启动早期就运行”,而是“用户登录后、图形界面或终端可用时立即运行”。这对绝大多数个人项目、本地AI服务、数据采集脚本、定时提醒工具等场景完全够用,而且更安全、更可控。

1.2 为什么推荐这个方法,而不是其他方案?

你可能听说过systemd、crontab @reboot、.bashrc追加、gnome-session-properties这些方式。它们各有适用场景,但对新手来说,存在几个现实门槛:

  • systemd服务:需要写.service文件,理解Target、WantedBy、Type=forking等概念,权限配置稍有偏差就启动失败,日志排查也略复杂;
  • crontab @reboot:实际触发时机早于用户会话建立,常因路径、环境变量缺失导致脚本找不到命令或文件;
  • .bashrc/.profile追加:只在打开新终端时生效,无法覆盖图形界面自动启动(比如你直接点图标登录,根本没开终端);
  • GNOME/KDE自启动目录:桌面环境绑定强,换系统或改桌面就失效,且对后台无界面程序支持不友好。

而我们接下来要用的方法——通过/etc/rc.local(兼容方案)+ 用户级脚本调用——优势非常明显:

  • 系统级支持,Ubuntu/Debian/CentOS主流版本默认可用(或一键启用)
  • 不依赖桌面环境,图形界面和纯终端都生效
  • 所有操作都是文件编辑和权限设置,没有抽象概念
  • 出错时只需注释掉一行就能禁用,无需卸载服务或清理注册表
  • 脚本以root权限运行,能访问系统资源(如USB设备、串口、GPU),适合AI推理、硬件控制类程序

它就像给系统装了个“开机闹钟”,到点就帮你把该干的事干了,稳当、透明、可追溯。

2. 动手做:四步完成开机自启(含完整代码和截图逻辑)

我们以一个真实场景为例:假设你有一个AI图像处理程序,放在/home/yourname/ai-tools/processor目录下,运行命令是./run_processor.sh,希望每次开机后自动启动并保持后台运行。下面就是你要做的全部事情。

2.1 第一步:写一个干净、可靠的启动脚本

别急着改系统文件,先把自己的程序包装成一个独立的.sh脚本。这是最关键的一步,也是最容易出错的地方。

打开终端,执行以下命令创建脚本(请把yourname替换成你自己的用户名):

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

在nano编辑器中,输入以下内容(注意逐字复制,尤其注意符号):

#!/bin/bash # 设置工作目录(非常重要!否则脚本可能找不到相对路径的文件) cd /home/yourname/ai-tools/processor # 记录启动时间,方便后续排查 echo "AI Processor started at $(date)" >> /home/yourname/logs/ai_startup.log # 启动主程序(这里用nohup确保退出终端后仍运行) nohup ./run_processor.sh > /home/yourname/logs/processor_output.log 2>&1 & # 可选:检查是否启动成功(根据你的程序调整) if pgrep -f "run_processor.sh" > /dev/null; then echo "$(date): Processor is running" >> /home/yourname/logs/ai_startup.log else echo "$(date): Failed to start Processor!" >> /home/yourname/logs/ai_startup.log fi

关键说明

  • #!/bin/bash是固定开头,告诉系统用bash解释器运行,必须顶格、不能有空格
  • cd切换到程序所在目录,避免因路径错误导致脚本静默失败
  • nohup ... &让程序在后台持续运行,即使关闭终端也不中断
  • >>2>&1把输出和错误都记录到日志,排查问题时全靠它
  • pgrep行是“健康检查”,运行后立刻确认进程是否存在,结果写入日志

保存退出:按Ctrl+O→ 回车 →Ctrl+X

然后给脚本添加执行权限(这是Linux的硬性要求):

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

验证这一步是否成功:直接在终端运行一次

/home/yourname/scripts/start_ai_processor.sh

如果没报错,且ps aux | grep run_processor.sh能看到进程,说明脚本本身没问题。

2.2 第二步:启用并配置/etc/rc.local(系统级启动入口)

Ubuntu 18.04及以后版本默认禁用了rc.local,但我们可以轻松启用它——它依然是最接近“开机即运行”的通用方案。

先检查rc.local是否存在:

ls -l /etc/rc.local
  • 如果显示No such file or directory,说明需要创建;
  • 如果显示权限为-rw-r--r--(即没有执行权限),说明需要修复;
  • 如果显示-rwxr-xr-x,说明已启用,跳到2.3步。
情况一:文件不存在 → 创建它
sudo nano /etc/rc.local

粘贴以下标准模板(注意:必须包含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. # 在这里添加你的命令 # 例如:su -c "/home/yourname/scripts/start_ai_processor.sh" -s /bin/bash yourname exit 0

保存退出,再赋予执行权限:

sudo chmod +x /etc/rc.local
情况二:文件存在但无执行权限 → 直接赋权
sudo chmod +x /etc/rc.local

验证rc.local是否真正生效
临时插入一条测试命令(仅用于验证,后面要删掉):

echo "RC_LOCAL_TEST: $(date)" | sudo tee -a /var/log/rc_local_test.log

然后重启:sudo reboot
重启后查看日志:cat /var/log/rc_local_test.log,如果看到时间戳,说明rc.local已正常触发。

2.3 第三步:把你的脚本“挂”进rc.local

现在,我们把第一步写的脚本,正式加入系统启动流程。

编辑rc.local

sudo nano /etc/rc.local

找到exit 0这一行,在它正上方插入以下两行(注意顺序!必须在exit 0之前):

# 启动AI处理器 su -c "/home/yourname/scripts/start_ai_processor.sh" -s /bin/bash yourname

为什么用su -c而不是直接写路径?
因为rc.local以root身份运行,而你的程序很可能需要访问用户家目录下的文件、GPU设备、或读取用户配置。直接用root运行可能导致权限拒绝或路径错误。su -c切换回你的用户身份,既安全又可靠。

重要提醒

  • yourname替换成你真实的用户名(用whoami命令确认)
  • 不要漏掉-s /bin/bash,否则可能因shell环境缺失导致脚本失败
  • 行首加#是注释,便于日后识别用途,不影响执行

保存退出。

2.4 第四步:重启测试 + 日志排查(小白友好型排错指南)

现在到了最激动人心的时刻——验证是否真的成功。

sudo reboot

等待系统重启完成,登录进去后,做三件事:

  1. 检查进程是否在跑

    ps aux | grep run_processor.sh

    如果看到类似./run_processor.sh的行,说明已启动。

  2. 查看启动日志

    cat /home/yourname/logs/ai_startup.log

    应该能看到类似:
    AI Processor started at Mon Jun 10 14:22:35 CST 2024
    Mon Jun 10 14:22:35 CST 2024: Processor is running

  3. 检查输出日志(确认程序没崩溃)

    tail -20 /home/yourname/logs/processor_output.log

    如果程序正常,这里应该有它的实时输出;如果有报错,第一行往往就是关键线索。

如果没成功?别慌,按这个顺序查

  • 检查/home/yourname/logs/目录是否存在?不存在就手动创建:mkdir -p /home/yourname/logs
  • 检查start_ai_processor.sh里的路径是否写错?用ls /home/yourname/ai-tools/processor/run_processor.sh确认
  • 检查rc.localsu -c命令中的用户名是否拼写正确?
  • 检查rc.local文件末尾是否有且仅有一个exit 0?多一个或少一个都会导致启动失败
  • 临时把rc.local里那行改成logger "TEST_RC_LOCAL",重启后查sudo journalctl -t logger看是否记录——快速判断是rc.local没运行,还是你的命令出错

只要按这个流程走,95%的问题都能定位出来。

3. 进阶技巧:让开机启动更聪明、更省心

上面四步已经能解决绝大多数需求。但如果你希望体验更好、管理更灵活,这里有几个实用小技巧,不用改核心逻辑,加几行代码就能升级。

3.1 技巧一:避免重复启动(防止多次开机后累积多个进程)

当前脚本每次开机都执行一次,但如果程序意外崩溃,rc.local不会自动重拉。更稳妥的做法是:开机时先检查进程是否已在运行,只有没运行才启动

修改你的start_ai_processor.sh,把启动部分换成:

# 检查是否已有进程在运行 if ! pgrep -f "run_processor.sh" > /dev/null; then echo "$(date): Starting Processor (no existing process)" >> /home/yourname/logs/ai_startup.log nohup ./run_processor.sh > /home/yourname/logs/processor_output.log 2>&1 & else echo "$(date): Processor already running" >> /home/yourname/logs/ai_startup.log fi

这样即使你手动运行过一次,再重启也不会多开一个实例。

3.2 技巧二:延时启动(避开系统资源争抢)

有些程序依赖网络、GPU驱动或数据库,开机瞬间可能还没就绪。加个10秒延时再启动,成功率更高:

# 在start_ai_processor.sh开头加 sleep 10

或者在rc.local里调用时加:

(sleep 10 && su -c "/home/yourname/scripts/start_ai_processor.sh" -s /bin/bash yourname) &

括号+&确保不阻塞其他启动任务。

3.3 技巧三:一键开关(想停就停,想开就开)

把启用/禁用做成两个快捷脚本,以后再也不用手动编辑rc.local

创建开关脚本:

nano /home/yourname/scripts/toggle_ai_startup.sh

内容如下:

#!/bin/bash RC_FILE="/etc/rc.local" SCRIPT_LINE='su -c "/home/yourname/scripts/start_ai_processor.sh" -s /bin/bash yourname' if [ "$1" = "on" ]; then if ! sudo grep -q "$SCRIPT_LINE" "$RC_FILE"; then sudo sed -i "\$i\\# AI Processor Startup\n$SCRIPT_LINE" "$RC_FILE" echo " 已启用开机启动" else echo "ℹ 开机启动已启用,无需重复操作" fi elif [ "$1" = "off" ]; then if sudo grep -q "$SCRIPT_LINE" "$RC_FILE"; then sudo sed -i "/$SCRIPT_LINE/d" "$RC_FILE" echo " 已禁用开机启动" else echo "ℹ 开机启动已禁用" fi else echo "用法:$0 on | off" fi

赋予权限并测试:

chmod +x /home/yourname/scripts/toggle_ai_startup.sh /home/yourname/scripts/toggle_ai_startup.sh on # 启用 /home/yourname/scripts/toggle_ai_startup.sh off # 禁用

从此,开关自启就像按电灯开关一样简单。

4. 常见问题解答(来自真实踩坑经验)

4.1 Q:我用的是Ubuntu 22.04,rc.local根本不存在,怎么办?

A:Ubuntu 22.04默认移除了rc.local支持,但你可以手动启用。执行以下三行命令即可恢复:

sudo systemctl enable rc-local.service sudo touch /etc/rc.local sudo chmod +x /etc/rc.local

然后按本文2.2节继续配置。这是官方支持的兼容方案,比改systemd更轻量。

4.2 Q:脚本运行了,但程序一闪就退出,日志里什么都没有?

A:大概率是环境变量缺失。GUI程序常依赖DISPLAYXAUTHORITY等变量。在你的启动脚本开头加上:

export DISPLAY=:0 export XAUTHORITY=/home/yourname/.Xauthority

(把yourname换成你的用户名)
如果是命令行程序,加一句env > /tmp/env_debug.log,重启后看/tmp/env_debug.log里缺什么变量。

4.3 Q:能不能让脚本只在图形界面启动,不在SSH登录时运行?

A:可以。在start_ai_processor.sh开头加判断:

if [ -z "$DISPLAY" ]; then echo "$(date): Not in GUI session, exit" >> /home/yourname/logs/ai_startup.log exit 0 fi

这样SSH登录时脚本会安静退出,只在桌面环境下生效。

4.4 Q:我的程序需要sudo权限(比如访问USB摄像头),怎么安全授权?

A:不要在脚本里直接写sudo ./program。更安全的做法是:

  1. 编辑sudoers:sudo visudo
  2. 添加一行(替换yourname):
    yourname ALL=(ALL) NOPASSWD: /home/yourname/ai-tools/processor/run_processor.sh
  3. 在脚本里用sudo /home/yourname/ai-tools/processor/run_processor.sh
    这样既免密,又限定只能运行指定程序,杜绝权限滥用风险。

5. 总结:你已经掌握了一个可靠、可扩展的自动化起点

回顾一下,我们完成了什么:

  • 写了一个健壮的启动脚本,包含路径切换、日志记录、进程检查
  • 启用了系统级启动入口rc.local,兼容新旧Ubuntu版本
  • su -c安全切换用户身份,避免root权限滥用
  • 学会了三步排错法:查进程、看日志、验路径
  • 掌握了延时启动、防重复、一键开关等实用增强技巧

这不仅仅是一个“让程序开机跑”的教程,它是一套可复用的自动化思维:把不确定的操作封装成确定的脚本,把人工步骤固化为系统行为,把故障排查沉淀为标准化日志

你现在完全可以把这个模式迁移到其他场景:

  • 让Python爬虫每天凌晨自动抓取数据
  • 让TensorFlow模型服务在开机后立即加载GPU
  • 让树莓派连接的传感器程序随系统启动
  • 让NAS上的媒体转码脚本自动待命

技术的价值不在于多酷炫,而在于多省心。当你不再为重复操作分心,才能真正聚焦在创造本身。


获取更多AI镜像

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

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

SenseVoice Small医疗随访系统:患者语音反馈→症状分级+复诊提醒生成

SenseVoice Small医疗随访系统:患者语音反馈→症状分级复诊提醒生成 1. 为什么医疗随访需要“听懂”患者说的话? 你有没有遇到过这样的场景:一位慢性病患者在复诊前,用手机录了一段3分钟的语音,说“最近晚上总咳嗽&a…

作者头像 李华
网站建设 2026/2/1 0:52:28

学生党福利!免费AI工具BSHM使用全攻略

学生党福利!免费AI工具BSHM使用全攻略 你是不是也遇到过这些场景: 做小组作业PPT,需要把同学照片抠出来换背景,但PS太难上手,美图秀秀又糊得看不清发丝;想给社团招新海报加点创意,可人像边缘总…

作者头像 李华
网站建设 2026/2/1 0:52:12

MT5中文改写模型公平性评估:性别、地域、职业相关表述偏差检测

MT5中文改写模型公平性评估:性别、地域、职业相关表述偏差检测 1. 为什么改写工具也需要“照镜子”? 你有没有试过让AI帮你改写一句话,结果发现—— 原本中性的“医生认真检查了病人”,变成了“女医生温柔地照顾病人”&#xff…

作者头像 李华
网站建设 2026/2/1 0:52:04

快速体验GPEN人像修复,三步搞定图片质量提升

快速体验GPEN人像修复,三步搞定图片质量提升 你有没有遇到过这些情况:翻出十年前的老照片,人脸模糊得看不清五官;朋友发来一张手机远距离抓拍,脸上的细节全被压缩成马赛克;或者社交媒体上下载的头像&#…

作者头像 李华
网站建设 2026/2/1 0:52:01

3步解锁Ryzen处理器潜能:SMUDebugTool调试指南

3步解锁Ryzen处理器潜能:SMUDebugTool调试指南 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: https://gitcode.c…

作者头像 李华
网站建设 2026/2/1 0:52:01

如何判断两个地址是否相同?MGeo给出答案

如何判断两个地址是否相同?MGeo给出答案 在日常业务系统中,你是否遇到过这样的问题:用户注册时填了“杭州西湖区文三路159号”,订单地址却写成“杭州市西湖区文三路近学院路159号”;物流系统里,“上海浦东…

作者头像 李华