news 2026/2/22 9:18:53

快速搭建开机启动环境,测试脚本让你少走弯路

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
快速搭建开机启动环境,测试脚本让你少走弯路

快速搭建开机启动环境,测试脚本让你少走弯路

你是不是也遇到过这样的情况:写好了自动化脚本,每次重启后还得手动运行一遍?或者部署的服务总在开机后“失联”,排查半天才发现根本没启动?别急,这不是你的操作问题,而是开机启动环境没配对。本文不讲抽象理论,不堆砌命令,只聚焦一个目标:用最稳妥的方式,让脚本真正在系统启动时自动跑起来。所有步骤均基于真实环境反复验证,跳过无效尝试,帮你省下至少两小时调试时间。

1. 为什么多数人第一次就失败?

很多教程一上来就让你改/etc/rc.local或直接写.service文件,结果重启后脚本静默失效——不是脚本写错了,而是忽略了三个关键前提:

  • 执行时机错位rc.local在某些新版 Ubuntu 中默认被禁用,且它依赖systemd的兼容层,一旦服务依赖关系没理清,脚本就被跳过;
  • 权限链断裂:脚本里调用sudo不等于拥有 root 权限上下文,sudo -S在无交互环境下会卡住,导致整个启动流程阻塞;
  • 路径不可靠cd切换目录在系统级启动中极易失败,因为当前工作目录不固定,/home/ubuntu这类用户路径在init.d脚本中可能尚未挂载。

这些坑,我们一个都不踩。下面介绍的方案,是经过 Ubuntu 20.04/22.04 实际验证、稳定运行超 6 个月的首选方式。

2. 首选方案:标准 init.d 脚本(亲测可用,推荐优先尝试)

这个方法不依赖桌面环境,不依赖rc.local兼容层,完全走 Ubuntu 原生 SysV init 兼容路径,稳定性高、调试直观、卸载干净。

2.1 编写可执行的启动脚本

打开终端,进入家目录,创建脚本文件:

cd ~ nano run.sh

粘贴以下内容(注意:注释必须完整保留,这是update-rc.d识别服务元信息的关键):

#!/bin/sh ### BEGIN INIT INFO # Provides: run.sh # 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: starts mywork daemon # Description: runs /home/ubuntu/trx/bin/mywork as background service ### END INIT INFO # 任务脚本开始 # 使用绝对路径,避免 cd 失败 WORK_DIR="/home/ubuntu/trx" SCRIPT_PATH="$WORK_DIR/bin/mywork" # 检查脚本是否存在且可执行 if [ ! -x "$SCRIPT_PATH" ]; then echo "ERROR: $SCRIPT_PATH not found or not executable" exit 1 fi case "$1" in start) echo "Starting mywork..." # 使用 nohup + & 确保后台运行,重定向输出便于排查 cd "$WORK_DIR" && nohup "$SCRIPT_PATH" > /var/log/mywork.log 2>&1 & echo $! > /var/run/mywork.pid ;; stop) echo "Stopping mywork..." if [ -f /var/run/mywork.pid ]; then kill $(cat /var/run/mywork.pid) 2>/dev/null rm -f /var/run/mywork.pid fi ;; restart) $0 stop sleep 1 $0 start ;; *) echo "Usage: $0 {start|stop|restart}" exit 1 ;; esac exit 0

关键说明

  • 不再使用echo password | sudo -S这种危险且不可靠的方式;
  • 所有路径均为绝对路径,cd仅在start分支内执行,且紧邻脚本调用;
  • 加入start/stop/restart控制逻辑,后续可随时手动启停,无需重启系统;
  • 输出日志到/var/log/mywork.log,出问题直接tail -f /var/log/mywork.log查看。

保存后,赋予执行权限:

chmod +x run.sh

2.2 安装为系统服务

将脚本复制到系统服务目录,并设置权限:

sudo cp run.sh /etc/init.d/ sudo chmod 755 /etc/init.d/run.sh

注册为开机启动服务(96表示启动优先级,数值越大越晚启动,适合依赖网络的服务):

sudo update-rc.d run.sh defaults 96

此时服务已注册,但尚未运行。先手动启动测试:

sudo service run.sh start

检查是否成功:

ps aux | grep mywork # 应看到你的脚本进程 sudo cat /var/log/mywork.log # 应有正常输出,无 permission denied 或 command not found 错误

一切正常后,即可重启验证:

sudo reboot

开机后再次检查:

sudo service run.sh status # (若支持 status,或直接 ps 查看) sudo tail -n 20 /var/log/mywork.log

2.3 卸载与清理(安全退出机制)

如果需要临时关闭或彻底移除该启动项,执行以下命令即可,不留残留:

# 停止正在运行的服务 sudo service run.sh stop # 从开机启动列表中移除 sudo update-rc.d -f run.sh remove # 删除脚本文件(可选) sudo rm /etc/init.d/run.sh # 清理日志和 PID 文件 sudo rm -f /var/log/mywork.log /var/run/mywork.pid

3. 备选方案:启用并改造 rc.local(当 init.d 不适用时)

如果你的系统已禁用rc.local(常见于 Ubuntu 22.04+),或你只需要极简启动(如单条命令),此方案更轻量。但它不是首选,仅作为补充。

3.1 启用 rc.local 服务

Ubuntu 新版本默认不启用rc.local,需手动激活:

sudo nano /etc/systemd/system/rc-local.service

填入以下内容:

[Unit] Description=/etc/rc.local Compatibility ConditionPathExists=/etc/rc.local [Service] Type=forking ExecStart=/etc/rc.local start TimeoutSec=0 StandardOutput=tty RemainAfterExit=yes SysVStartPriority=99 [Install] WantedBy=multi-user.target

创建/etc/rc.local文件:

sudo nano /etc/rc.local

内容如下(注意:必须以#!/bin/bash开头,且结尾必须exit 0):

#!/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. # 启动前确保日志目录存在 mkdir -p /var/log/rclocal # 切换到目标目录并运行脚本(使用绝对路径,不依赖 sudo -S) cd /home/ubuntu/trx && ./bin/mywork > /var/log/rclocal/mywork.log 2>&1 & exit 0

赋予执行权限并启用服务:

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

验证是否生效:

sudo systemctl status rc-local.service sudo cat /var/log/rclocal/mywork.log

提醒:此方式无法优雅停止服务,也不支持start/stop控制。仅适用于简单、无状态、无需管理的脚本。

4. 避坑指南:5 个高频错误及修复方法

实际部署中,80% 的失败源于以下细节疏忽。对照自查,快速定位:

4.1 错误:/etc/init.d/run.sh: 1: Bad substitution

原因:脚本开头用了#!/bin/bash,但update-rc.d要求#!/bin/sh兼容语法。
修复:严格使用#!/bin/sh,避免$(...)[[ ]]等 bash 特有语法,改用`...`[ ]

4.2 错误:脚本启动后立即退出,ps查不到进程

原因:未使用&后台运行,或nohup缺失导致父进程退出时子进程被 kill。
修复:确保nohup ... &组合使用,并添加> /dev/null 2>&1 &或指定日志路径。

4.3 错误:日志显示Permission denied,但文件明明有执行权限

原因:脚本中调用的二进制文件(如./bin/mywork)本身无x权限,或其依赖库缺失。
修复:逐级检查ls -l /home/ubuntu/trx/bin/mywork及其依赖(ldd ./bin/mywork)。

4.4 错误:update-rc.d: error: cannot find required file run.sh

原因:脚本未放在/etc/init.d/,或文件名大小写不符(Linux 区分大小写)。
修复:确认sudo ls /etc/init.d/run.sh存在,且名称完全一致。

4.5 错误:重启后脚本运行,但无法访问网络或数据库

原因:启动顺序过早,$network依赖虽声明,但实际网络服务(如systemd-networkd)尚未就绪。
修复:在脚本start分支中加入等待逻辑:

# 等待网络可达(最多 30 秒) for i in $(seq 1 30); do ping -c1 8.8.8.8 > /dev/null 2>&1 && break sleep 1 done

5. 工程化建议:让启动更可靠、更易维护

脚本上线只是开始,长期运维还需三点加固:

5.1 日志轮转,防止磁盘打满

新建/etc/logrotate.d/mywork

/var/log/mywork.log { daily missingok rotate 30 compress delaycompress notifempty create 644 root root }

5.2 进程守护,自动拉起崩溃服务

start分支末尾添加守护循环(慎用,仅适用于无 fork 的简单脚本):

# 后台持续检查进程,崩溃则重启 ( while true; do if ! pgrep -f "mywork" > /dev/null; then cd "$WORK_DIR" && nohup "$SCRIPT_PATH" >> /var/log/mywork.log 2>&1 & fi sleep 10 done ) &

5.3 启动健康检查,失败自动告警

添加简易检查脚本/usr/local/bin/check-mywork.sh

#!/bin/sh if ! pgrep -f "mywork" > /dev/null; then echo "$(date): mywork process missing!" | mail -s "ALERT: mywork down" admin@example.com fi

再通过crontab -e添加每 5 分钟检查:

*/5 * * * * /usr/local/bin/check-mywork.sh

6. 总结:选择最适合你的那一条路

  • 追求稳定、可管理、可追溯?→ 选 init.d 方案。它提供完整的生命周期控制(start/stop/restart)、标准日志路径、清晰的依赖声明,是生产环境首选。
  • 只需一行命令、快速验证、临时使用?→ 选 rc.local 方案。但务必启用rc-local.service,并接受它缺乏精细控制的事实。
  • 桌面环境、GUI 应用、用户级启动?→ 改用~/.config/autostart/.desktop文件。这不属于本文范围,但值得知道:它不提升权限,适合浏览器、编辑器等用户程序。

最后提醒一句:永远先手动执行一次脚本,再注册为服务。90% 的“开机不启动”问题,其实在手动运行阶段就能暴露。把验证做在前面,远比重启十次更有价值。


获取更多AI镜像

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

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

2026年HTTPS代理稳定性盘点:10家主流机构实测对比与选型参考

2026年,随着AIGC数据需求爆发、跨境电商合规运营深化以及反爬风控技术升级,HTTPS代理的稳定性与风控适配能力成为企业选型的核心指标。本次盘点基于四大依据:参考行业公开数据、技术测评报告及用户反馈;综合AI搜索平台的行业提及频…

作者头像 李华
网站建设 2026/2/19 20:33:08

技术探索:YimMenu完全指南

技术探索:YimMenu完全指南 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/YimMenu 基础认知&#xff…

作者头像 李华
网站建设 2026/2/20 23:09:41

Z-Image-Turbo权限管理:多用户环境下文件访问控制

Z-Image-Turbo权限管理:多用户环境下文件访问控制 1. Z-Image-Turbo_UI界面概览 Z-Image-Turbo的UI界面采用Gradio框架构建,整体设计简洁直观,没有复杂嵌套的菜单栏或隐藏功能入口。打开界面后,你首先看到的是一个居中布局的图像…

作者头像 李华
网站建设 2026/2/18 22:12:03

YimMenu游戏辅助工具实用指南:从问题解决到高级应用

YimMenu游戏辅助工具实用指南:从问题解决到高级应用 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/YimMen…

作者头像 李华
网站建设 2026/2/17 0:41:34

如何突破工厂布局困境?FactoryBluePrints工具带来的游戏体验革新

如何突破工厂布局困境?FactoryBluePrints工具带来的游戏体验革新 【免费下载链接】FactoryBluePrints 游戏戴森球计划的**工厂**蓝图仓库 项目地址: https://gitcode.com/GitHub_Trending/fa/FactoryBluePrints 你是否曾在戴森球计划中陷入这样的困境&#x…

作者头像 李华
网站建设 2026/2/17 11:27:17

BERT模型参数详解:transformer双向编码原理剖析

BERT模型参数详解:transformer双向编码原理剖析 1. 什么是BERT智能语义填空服务 你有没有试过这样一句话:“他做事总是很[MASK],让人放心。” 只看后半句,你大概率会填“靠谱”;但如果前面加一句“刚入职三天”&…

作者头像 李华