news 2026/4/28 20:27:15

简单又实用!教你用脚本实现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/4/27 6:12:48

Qwen1.5-0.5B-Chat为何高效?轻量模型架构深度解析

Qwen1.5-0.5B-Chat为何高效?轻量模型架构深度解析 1. 引言:轻量级大模型的现实需求 随着大语言模型在各类应用场景中的广泛落地,对算力和资源的需求也日益增长。然而,在边缘设备、嵌入式系统或低成本部署场景中,高参…

作者头像 李华
网站建设 2026/4/18 12:25:46

Qwen3-Reranker-0.6B语音识别:文本后处理

Qwen3-Reranker-0.6B语音识别:文本后处理 1. 引言 随着自动语音识别(ASR)技术的广泛应用,如何提升识别结果的准确性和语义连贯性成为关键挑战。在多候选识别路径中,选择最优文本输出不仅依赖于声学模型和语言模型&am…

作者头像 李华
网站建设 2026/4/23 20:47:45

CosyVoice-300M Lite实战:构建智能客服语音系统

CosyVoice-300M Lite实战:构建智能客服语音系统 基于阿里通义实验室 CosyVoice-300M-SFT 的高效率 TTS 服务 1. 引言:轻量级TTS在智能客服中的价值 随着智能客服系统的广泛应用,语音交互已成为提升用户体验的关键环节。传统语音合成&#xf…

作者头像 李华
网站建设 2026/4/23 13:38:07

Speech Seaco Paraformer实战案例:法律庭审录音批量转文字部署教程

Speech Seaco Paraformer实战案例:法律庭审录音批量转文字部署教程 1. 引言 在司法实践中,法律庭审录音的数字化处理是一项重要且繁琐的工作。传统的人工听写方式效率低下、成本高昂,而自动语音识别(ASR)技术的成熟为…

作者头像 李华
网站建设 2026/4/27 21:02:39

BGE-M3环境配置太麻烦?云端镜像免安装,直接调用API

BGE-M3环境配置太麻烦?云端镜像免安装,直接调用API 你是不是也遇到过这样的情况:作为一名Java工程师,突然接到任务要集成一个AI文本向量模型BGE-M3,用来做文档检索或语义匹配。结果一查资料发现,这玩意儿是…

作者头像 李华
网站建设 2026/4/27 19:22:15

手把手教你迁移触发器从MySQL到PostgreSQL

从 MySQL 到 PostgreSQL:触发器迁移实战指南 你有没有遇到过这样的场景?系统要从 MySQL 迁移到 PostgreSQL,表结构导过去了,数据也同步了,结果一上线发现某些关键业务逻辑“失灵”了——比如审计日志不再记录、字段更…

作者头像 李华