news 2026/4/23 14:07:16

简单又实用!教你用脚本实现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/23 11:50:58

通义千问2.5-7B部署教程:vLLM集成与高吞吐推理配置

通义千问2.5-7B部署教程:vLLM集成与高吞吐推理配置 1. 引言 1.1 学习目标 本文旨在为AI开发者、运维工程师及技术爱好者提供一份完整、可落地的通义千问2.5-7B-Instruct模型部署指南。通过本教程,您将掌握: 如何使用 vLLM 高效部署 Qwen2…

作者头像 李华
网站建设 2026/4/23 11:36:52

SAM 3视频分割案例:虚拟现实场景构建

SAM 3视频分割案例:虚拟现实场景构建 1. 技术背景与应用价值 随着计算机视觉技术的不断演进,图像与视频中的对象分割已成为智能交互、增强现实(AR)、虚拟现实(VR)和自动驾驶等前沿领域的核心技术之一。传…

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

通义千问2.5-7B功能测评:vLLM加速下的多语言表现

通义千问2.5-7B功能测评:vLLM加速下的多语言表现 1. 引言 随着大模型在实际业务场景中的广泛应用,如何在有限算力条件下实现高效推理成为关键挑战。通义千问2.5-7B-Instruct作为阿里云推出的中等体量全能型语言模型,在保持较小参数规模的同…

作者头像 李华
网站建设 2026/4/23 11:27:29

AutoGLM-Phone企业定制:私有化部署与二次开发指南

AutoGLM-Phone企业定制:私有化部署与二次开发指南 1. 引言 1.1 技术背景与行业需求 随着移动智能终端的普及,用户对手机操作自动化的需求日益增长。传统脚本化或规则驱动的自动化工具(如Auto.js)在面对复杂界面变化和多任务逻辑…

作者头像 李华
网站建设 2026/4/23 11:26:49

跑BGE-M3省钱攻略:云端按需付费,比买显卡省上万元

跑BGE-M3省钱攻略:云端按需付费,比买显卡省上万元 你是不是也遇到过这种情况:客户突然发来一个文本相似度项目,点名要用 BGE-M3 模型,时间紧任务重,但你手头没有合适的GPU设备?更头疼的是&…

作者头像 李华
网站建设 2026/4/10 7:01:47

FSMN VAD与RNNoise对比:噪声环境下检测效果评测

FSMN VAD与RNNoise对比:噪声环境下检测效果评测 1. 引言 1.1 语音活动检测的技术背景 语音活动检测(Voice Activity Detection, VAD)是语音信号处理中的基础模块,广泛应用于语音识别、语音增强、会议转录、通话分析等场景。其核…

作者头像 李华