news 2026/5/11 1:19:39

简单又实用!教你用脚本实现Ubuntu程序自动启动

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
简单又实用!教你用脚本实现Ubuntu程序自动启动

简单又实用!教你用脚本实现Ubuntu程序自动启动

1. 引言:为什么需要开机自动启动?

在实际的服务器运维、嵌入式设备部署或桌面自动化场景中,我们常常希望某些关键服务或自定义脚本能够在系统重启后无需人工干预即可自动运行。例如:

  • 启动一个后台监控程序
  • 自动挂载网络存储
  • 运行AI推理服务
  • 执行定时数据同步任务

Ubuntu作为广泛使用的Linux发行版,提供了多种方式来配置开机启动任务。本文将围绕“如何通过脚本实现程序开机自动启动”这一核心目标,详细介绍两种稳定可靠的方法,并提供完整的操作步骤、注意事项和可执行代码。

文章内容基于真实环境测试(Ubuntu 20.04/22.04),所有方案均已验证可用,适合开发者、运维人员及树莓派等智能硬件用户参考使用。

2. 方法一:使用 Systemd 服务管理器(推荐)

随着 Ubuntu 逐渐从传统的 SysVinit 迁移到systemd,现代 Linux 系统更推荐使用.service文件的方式来管理开机启动任务。该方法更加标准化、易于调试且支持依赖控制。

2.1 创建自定义服务文件

首先,在/etc/systemd/system/目录下创建一个以.service结尾的服务文件。假设我们要启动的脚本名为mywork.sh,则执行以下命令:

sudo nano /etc/systemd/system/mywork.service

填入如下内容:

[Unit] Description=Custom Startup Script for mywork After=network.target syslog.target [Service] Type=simple User=ubuntu WorkingDirectory=/home/ubuntu/trx ExecStart=/bin/bash /home/ubuntu/trx/bin/mywork.sh Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target
参数说明:
  • Description: 服务描述信息,便于识别。
  • After: 指定本服务在哪些目标之后启动,确保网络已就绪。
  • Type=simple: 表示主进程由ExecStart直接启动。
  • User: 指定运行脚本的用户,避免权限问题。
  • WorkingDirectory: 设置工作目录,防止路径错误。
  • ExecStart: 实际要执行的命令。
  • Restart: 出错时自动重启,提升稳定性。
  • WantedBy=multi-user.target: 表示在多用户模式下启用此服务。

2.2 编写并授权启动脚本

确保你的实际脚本存在并具有可执行权限。例如:

nano /home/ubuntu/trx/bin/mywork.sh

内容示例:

#!/bin/bash # 示例:记录启动时间并运行主程序 echo "[$(date)] MyWork Service Started" >> /home/ubuntu/trx/logs/start.log # 此处添加你的具体业务逻辑 python3 /home/ubuntu/trx/app.py &

保存后赋予执行权限:

chmod +x /home/ubuntu/trx/bin/mywork.sh

2.3 启用并测试服务

完成配置后,执行以下命令加载新服务:

# 重载 systemd 配置 sudo systemctl daemon-reexec sudo systemctl enable mywork.service # 启动服务(无需重启即可测试) sudo systemctl start mywork.service # 查看状态 sudo systemctl status mywork.service

如果显示active (running),说明服务已成功运行。

2.4 开机验证与日志排查

重启系统进行最终验证:

sudo reboot

登录后检查服务状态和日志:

systemctl status mywork.service journalctl -u mywork.service --since "1 hour ago"

若发现问题,可通过日志快速定位错误原因。


3. 方法二:利用 rc.local 兼容性启动(传统方式)

对于一些轻量级任务或临时需求,可以使用经典的rc.local方式。虽然 Ubuntu 新版本默认不再包含该文件,但我们可以手动启用它。

3.1 创建并配置 rc.local 脚本

创建文件:

sudo nano /etc/rc.local

输入以下内容:

#!/bin/bash # # 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. # 添加你的启动命令 /home/ubuntu/trx/bin/mywork.sh & exit 0

⚠️ 注意:必须保留exit 0,否则系统可能卡住。

设置可执行权限:

sudo chmod +x /etc/rc.local

3.2 启用 rc-local.service

systemd 提供了一个兼容单元rc-local.service来支持rc.local的执行。我们需要先确认其是否存在:

systemctl list-unit-files | grep rc-local

如果未启用,则手动启用:

sudo systemctl enable rc-local.service

然后启动服务测试:

sudo systemctl start rc-local.service sudo systemctl status rc-local.service

成功后,下次开机时rc.local中的命令将自动执行。

3.3 常见问题与解决方案

问题现象可能原因解决办法
系统启动变慢或卡顿rc.local中有阻塞操作使用&将命令放入后台
脚本无法访问网络网络尚未初始化rc.local前添加sleep 10延迟执行
权限不足脚本需 root 权限使用sudo -u ubuntu切换用户运行

4. 方法三:SysVinit 风格脚本(适用于旧系统)

尽管已被弃用,但在部分老旧系统或特定环境中仍可能需要使用/etc/init.d/下的传统启动脚本。

4.1 编写启动脚本

创建脚本文件:

sudo nano /etc/init.d/mysetup

内容如下(注意替换路径和名称):

#!/bin/sh ### BEGIN INIT INFO # Provides: mysetup # Required-start: $local_fs $remote_fs $network $syslog # Required-Stop: $local_fs $remote_fs $network $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start custom script at boot time # Description: Run mywork.sh during system startup ### END INIT INFO case "$1" in start) echo "Starting mywork..." su - ubuntu -c '/home/ubuntu/trx/bin/mywork.sh &' ;; stop) echo "Stopping mywork..." pkill -f mywork.sh ;; *) echo "Usage: /etc/init.d/mysetup {start|stop}" exit 1 ;; esac exit 0

4.2 安装到启动项

赋予权限并注册为开机服务:

sudo chmod 755 /etc/init.d/mysetup sudo update-rc.d mysetup defaults 95

其中95是启动优先级,数字越大越晚启动,建议根据是否依赖网络调整。

卸载方式:

sudo update-rc.d -f mysetup remove

5. 总结

本文系统介绍了三种在 Ubuntu 上实现程序开机自动启动的方法,各有适用场景:

方法优点缺点推荐指数
Systemd 服务标准化、易管理、支持依赖和日志学习成本略高⭐⭐⭐⭐⭐
rc.local简单直观、适合小任务不支持细粒度控制⭐⭐⭐☆
SysVinit 脚本兼容老系统已过时,维护困难⭐⭐

最佳实践建议:

  1. 优先使用 Systemd:这是当前和未来的标准,功能强大且集成度高。
  2. 避免阻塞式调用:所有长时间运行的任务应以后台方式启动(加&)。
  3. 合理设置启动顺序:依赖网络的服务应在network.target之后启动。
  4. 定期测试重启效果:确保配置持久有效。

通过以上任一方法,你都可以轻松实现 Ubuntu 系统下的程序自动化启动,提升系统的自主性和可用性。

6. 附录:常见问题 FAQ

  • Q:脚本能正常运行,但开机不生效?
    A:检查是否忘记systemctl enableupdate-rc.d注册服务。

  • Q:如何让脚本输出日志?
    A:在命令后重定向输出,如>> /tmp/start.log 2>&1

  • Q:能否同时启动多个脚本?
    A:可以,每个脚本单独配置一个.service文件,便于独立管理。

  • Q:桌面环境下如何自动打开终端运行脚本?
    A:可在.desktop文件中使用gnome-terminal -e "./script.sh"并放入~/.config/autostart/


获取更多AI镜像

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

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

DeepSeek-R1-Distill-Qwen-1.5B优化:量化模型精度保持技巧

DeepSeek-R1-Distill-Qwen-1.5B优化:量化模型精度保持技巧 1. 技术背景与核心价值 随着大模型在推理能力上的持续突破,如何在资源受限的设备上部署高性能语言模型成为边缘计算和终端智能的关键挑战。DeepSeek-R1-Distill-Qwen-1.5B 正是在这一背景下诞…

作者头像 李华
网站建设 2026/5/1 9:27:09

Glyph与传统OCR技术对比:语义理解优势实测

Glyph与传统OCR技术对比:语义理解优势实测 1. 引言:视觉推理时代的语义挑战 随着文档数字化和智能信息提取需求的不断增长,传统OCR(光学字符识别)技术长期作为文本图像处理的核心手段。然而,其在复杂版式…

作者头像 李华
网站建设 2026/5/9 22:11:34

BGE-Reranker-v2-m3 API测试:10块钱搞定全流程验证

BGE-Reranker-v2-m3 API测试:10块钱搞定全流程验证 你是不是也遇到过这样的情况?作为后端工程师,手头有个项目急需测试一个文本重排序模型的API接口,但又不想从零开始搭建环境、写部署代码。自己配置Python环境、安装依赖、处理C…

作者头像 李华
网站建设 2026/5/9 4:50:28

零基础也能玩转AI绘图:Z-Image-Turbo WebUI保姆级入门指南

零基础也能玩转AI绘图:Z-Image-Turbo WebUI保姆级入门指南 阿里通义Z-Image-Turbo WebUI图像快速生成模型 二次开发构建by科哥 阿里通义Z-Image-Turbo WebUI图像快速生成模型 二次开发构建by科哥 1. 学习目标与前置准备 本文是一篇面向零基础用户的 Z-Image-Turb…

作者头像 李华
网站建设 2026/5/4 14:44:36

神经网络调参就像养孩子,这些参数不懂就白忙活

手写识别的烦恼 想象一下这个场景:你正在开发一个能识别手写数字的APP,准备让爷爷奶奶也能用手机记账。结果第一版模型训练出来,你兴冲冲地让奶奶写个"8",模型愣是识别成了"0"。奶奶瞪着眼说:&qu…

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

ComfyUI长视频生成方案:12G显存云端即用,拒绝爆显存

ComfyUI长视频生成方案:12G显存云端即用,拒绝爆显存 你是不是也遇到过这种情况:作为一个想用AI做内容的UP主,手头有创意、有脚本,甚至配音都准备好了,结果一到“视频生成”这一步就卡壳?本地8G…

作者头像 李华