如何在启动时运行 bash 脚本

如何在启动时运行 bash 脚本

我知道这个问题已被问过好几次了但我就是无法让它发挥作用。

以下是我为使其运行所采取的步骤:

  1. 编写脚本保存为collection.sh
  2. 搬去collection.sh/etc/init.d
  3. 执行$ sudo chmod 711 /etc/init.d/collection.sh以设置执行脚本的权限
  4. 执行$ ln -s /etc/init.d/collection.sh /etc/rc0.d/以创建符号链接/etc/rc0.d
  5. 重新启动机器$ 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 更新程序提供参数。如果您没有模板,您可能有一个可以用作模板的简单脚本。

一些发行版正在转向执行初始化的替代方法。请查看您的发行版文档。

相关内容