解决Ubuntu开机启动项rc.local不工作的问题

本文记录了解决Linux系统中开机自启动脚本问题的过程,包括创建脚本、配置开机启动、添加LSB标签、调整脚本位置及最终采用sleep指令确保程序稳定运行的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

整个过程异常困难,还好最后成功了。

首先尝试了在/etc/init.d下新建自己的脚本,然后加权限【sudo chmod +x 脚本】,接下来配置开机启动【sudo update-rc.d 脚本 defaults】。按理说这样就OK了,但是此处可能会看到一个missing LSB tag的错误,可以选择忽视掉,解决办法之一是非常粗暴的删除insserv这个东西(用apt删),另一种办法是添加他要的那个LSB tag. 具体格式参见【man insserv】,总之就是一堆注释。如果想修改脚本的话,记得先用【sudo update-rc.d -f 脚本 remove】将脚本从启动项中删除.

然而这样改了,开机之后照样没有启动。之后又尝试了网上的一堆解决方案。

#!/bin/sh的问题,有的博客说/bin/sh连接到了dash而不是bash,所以需要修改第一行为#!/bin/bash。但是改了之后也不好使。

runlevel的问题,改了半天重启无数次也没看见有什么效果…

环境变量的问题,我的脚本都是绝对路径,不存在这个问题。

而后又切换到/etc/rc.local和/etc/init.d/rc.local上,通过查看代码可以看出/etc/init.d/rc.local执行了/etc/rc.local,而rc.local这个东西也没有什么runlevel的问题,于是在修改了第一行的前提下,尝试将脚本写到这里面。重启,仍然失效。

最后发现了某位博主的神奇方法,在所有命令之前加一行sleep 1或者sleep 3或者更长。原博主给出的解释是:【rc.local默认的执行用户是root,权限也是。killall -QUIT uwsgi是异步的,中间要sleep 1,歇一秒,不然直接start会继续被杀掉。】翻译过来就是,rc.local脚本在执行期间,很有可能遇到QUIT信号什么的,在这个期间如果程序还在执行就会退出。所以要sleep来躲掉这个信号。

对于这个解释我也是醉了… 不过确实是奏效的. 然而副作用也很明显,在开机的过程中能明显的看出停顿(因为sleep了,这里sleep的越长,开机的卡顿就越明显)

### 使用 `rc.local` 配置服务开机启动 在 Linux 系统中,可以通过编辑 `/etc/rc.local` 文件来配置服务或脚本开机启动。以下是具体的操作流程: #### 1. 检查并赋予 `rc.local` 可执行权限 确保 `/etc/rc.local` 或者 `/etc/rc.d/rc.local` 文件具有可执行权限。如果没有,则需要手动赋予权限。 对于 Ubuntu 和 CentOS/RHEL 系统: ```bash sudo chmod +x /etc/rc.local ``` 如果是基于 Red Hat 的系统(如 CentOS 或 RHEL),可能需要操作 `/etc/rc.d/rc.local` 文件: ```bash sudo chmod +x /etc/rc.d/rc.local ``` 此步骤非常重要,因为默认情况下该文件可能是执行的[^2]。 #### 2. 创建或修改 `rc.local` 文件 如果存在 `/etc/rc.local` 文件,则需要创建它,并添加必要的内容。例如,在 Ubuntu 上可以这样操作: ```bash sudo touch /etc/rc.local sudo chmod 755 /etc/rc.local echo '#!/bin/bash' | sudo tee /etc/rc.local ``` 接着,在文件中加入要执行的服务或脚本命令。例如,假设有一个名为 `start_service.sh` 的脚本需要在开机时运行: ```bash #!/bin/bash # 启动某个服务 /opt/start_service.sh & exit 0 ``` 注意:每条命令后面最好加上 `&` 符号以便后台运行,防止阻塞后续命令的执行[^4]。 #### 3. 对于使用 Systemd 的现代 Linux 发行版 许多较新的 Linux 版本已经弃用了传统的 SysVinit 脚本机制而改用 systemd 来管理服务。因此,即使存在 `rc.local` 支持,也需要额外启用对应的 systemd 单元文件才能使其生效。 ##### (a)创建 `rc-local.service` 文件 新建一个 systemd service 定义文件用于加载 `rc.local` 中的内容: ```bash sudo nano /etc/systemd/system/rc-local.service ``` 向其中输入以下内容: ```ini [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 ``` ##### (b)重新加载 systemd 并启用服务 完成上述配置后,需刷新 systemd 缓存并将新服务设为开机启动项: ```bash sudo systemctl daemon-reload sudo systemctl enable rc-local.service sudo systemctl start rc-local.service ``` 验证状态是否正常工作: ```bash sudo systemctl status rc-local.service ``` 此时应该可以看到 `rc.local` 已被成功激活并且会在每次机器重启时自动触发内部定义的任务列表[^4]^。 --- ### 注意事项 - **环境变量问题**:某些复杂的应用程序依赖特定的 shell 环境或者 PATH 设置;在这种场景下建议显式指定完整路径而非相对路径。 - **兼容性考量**:尽管大部分主流发行版本仍然保留了对 `rc.local` 的支持作为向下兼容手段之一,但从长远来看推荐逐步迁移到纯正的 systemd unit files 实现相同的功能需求[^5]. ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值