我知道这个问题已被问过好几次了但我就是无法让它发挥作用。
以下是我为使其运行所采取的步骤:
- 编写脚本保存为
collection.sh
- 搬去
collection.sh
/etc/init.d
- 执行
$ sudo chmod 711 /etc/init.d/collection.sh
以设置执行脚本的权限 - 执行
$ ln -s /etc/init.d/collection.sh /etc/rc0.d/
以创建符号链接/etc/rc0.d
- 重新启动机器
$ sudo reboot
这些步骤在启动时运行失败collection.sh
。那么有人能指出我做错了什么吗?
我以为我可能在错误的文件夹中创建了符号链接,rc?.d
因为有 0-6 和 Src
文件夹。如果是这样,应该在哪个文件夹中创建?
答案1
我认为你做错了三件事。
首先:您需要将软链接放入其中,/etc/rcS.d/
以便在机器进入“单用户”模式(无网络可用)时运行,并在/etc/rc[2-5].d/
机器进入“多用户”模式(运行级别 2 至 5)时运行。/etc/rc0.d/
只有当机器被告知要关闭时才会进入运行级别 0。运行级别 6 用于“重新启动”。请参阅维基百科页面UNIX 运行级别
第二:软链接的名称不能是collection.sh
。它需要采用S09collection
“S”表示的形式开始而“09”意味着在所有 08 个脚本都启动后启动。 看这里更多细节。
第三:init 用于启动守护进程服务,不应直接用于运行 collection.sh。您需要创建一个实际的 init 脚本来处理 collection.sh 守护进程的启动和停止。研究预先存在的 init 脚本以了解/etc/init.d/
它们的工作原理。或者,查看以下链接以获取有关编写 init 脚本的更多文档。
- 这里是关于编写符合 LSB 的 init 脚本的方法。对于符合 LSB 的 Linux 发行版,建议使用此方法。我注意到您在问题中标记了“ubuntu”,所以我应该提到 Ubuntu(与所有基于 Debian 的发行版一样)符合 LSB。
- 这里是有关如何使初始化脚本符合 LSB 规范的 Debian wiki 指南。
- 这里是关于 System V 风格初始化脚本的“快速而简单的”指南。
- 这里是 Github 上 System V 风格初始化脚本的模板。
此外,您不需要直接在/etc/rc?.d
文件夹中创建符号链接。主流发行版都有自动化工具来执行此操作。请参阅本文更多细节。
答案2
如果不看你的脚本就很难知道为什么这不起作用,但你采取的步骤看起来很合理。
解释失败的一些可能性可能是
- 您没有将 #!/bin/bash 作为脚本的第一行
- 您依赖的二进制文件路径尚未配置。
- 您的脚本没有考虑到启动脚本传递的参数,如启动、停止、重新加载等。
在启动时运行脚本的另一种方法(对于大多数发行版而言)是将其简单地添加到 /etc/rc.local - 这具有最后运行的额外优势,因此将满足先决条件。
答案3
符号链接需要以三个字符的键作为前缀,由表示开始的“S”或表示终止/停止的“K”以及后跟两位数的命令组成。
大多数发行版都包含这样的程序,update-rc.d
它将根据需要创建和删除符号链接。尝试使用命令man -k rc.d
来查找文档。
您的目录中可能有一个模板/etc/init.d
。它可能包含特殊格式的注释,旨在为 rd.d 更新程序提供参数。如果您没有模板,您可能有一个可以用作模板的简单脚本。
一些发行版正在转向执行初始化的替代方法。请查看您的发行版文档。