news 2026/9/9 17:53:00

简单又实用!教你用脚本实现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/9/9 8:23:29

二维码生成与识别一站式解决方案:AI智能二维码工坊

二维码生成与识别一站式解决方案:AI智能二维码工坊 1. 引言 1.1 业务场景描述 在现代数字化办公、营销推广和物联网设备交互中,二维码已成为信息传递的重要载体。无论是线下广告扫码跳转、电子票务核验,还是工业设备参数配置,高…

作者头像 李华
网站建设 2026/9/2 22:36:04

老照片修复质量控制体系:基于DDColor的QC流程

老照片修复质量控制体系:基于DDColor的QC流程 1. 引言:黑白老照片智能修复的技术背景与挑战 随着数字图像处理技术的发展,老照片修复逐渐从传统手工修复转向智能化、自动化流程。其中,DDColor作为一种先进的图像着色算法&#x…

作者头像 李华
网站建设 2026/9/6 3:53:18

bge-large-zh-v1.5从零开始:完整部署与测试流程详解

bge-large-zh-v1.5从零开始:完整部署与测试流程详解 随着大模型应用在语义理解、信息检索和智能问答等场景的深入,高质量中文嵌入(Embedding)模型的需求日益增长。bge-large-zh-v1.5作为当前表现优异的中文语义向量模型之一&…

作者头像 李华
网站建设 2026/9/8 12:16:41

手把手教你用GPEN镜像修复模糊人脸,超简单

手把手教你用GPEN镜像修复模糊人脸,超简单 1. 引言 1.1 业务场景描述 在日常生活中,我们常常会遇到一些老旧、模糊或低分辨率的人脸照片,比如家庭相册中的老照片、监控截图中的人物面部、手机拍摄的远距离人像等。这些图像由于分辨率低、噪…

作者头像 李华
网站建设 2026/9/8 12:16:07

Kotaemon元数据过滤:按部门/时间/类别精准检索文档内容

Kotaemon元数据过滤:按部门/时间/类别精准检索文档内容 1. 背景与核心价值 在企业级文档问答(DocQA)系统中,随着知识库中文档数量的快速增长,如何高效、准确地定位目标信息成为关键挑战。传统的全文检索方式往往返回…

作者头像 李华
网站建设 2026/9/8 12:17:25

DDColor黑白照片上色教程:一键还原珍贵记忆的保姆级指南

DDColor黑白照片上色教程:一键还原珍贵记忆的保姆级指南 1. 引言:让老照片重焕生机 在数字化时代,我们拥有越来越多方式保存和分享记忆。然而,许多承载着家族历史与个人情感的老照片仍停留在黑白影像阶段。这些图像虽然记录了重要…

作者头像 李华