奖励积分

奖励积分

我目前正在尝试了解在系统启动/引导时运行脚本init.d和 cron之间的区别。@reboot

使用@reboot(这个方法在这个论坛经过钱德拉)更简单,只需进入crontab -e并创建一个@reboot /some_directory/to_your/script/your_script.txt,然后your_script.txt每次系统重新启动时都会执行。深入的解释@reboot这里

或者通过嵌入/etc/init.d/your_script.txt第二行你的脚本的即:

#!/bin/bash
# /etc/init.d/your_script.txt

您可以运行,并且每次系统启动时chmod +x /etc/init.d/your_script.txt也应该运行。your_script.txt

  1. 两者之间的主要区别是什么?
  2. 哪个更坚固?
  3. 两者中有更好的一个吗?
  4. 这是嵌入脚本以在引导期间运行的正确方法吗?

我将合并一个 bash .sh 文件以在启动期间运行。

答案1

init.d也称为 SysV 脚本,用于在系统初始化和关闭期间启动和停止服务。 (/etc/init.d/脚本也可以在启用 systemd 的系统上运行以实现兼容性)。

  • 该脚本在启动和关闭期间执行(默认情况下)。
  • 该脚本应该是一个 init.d 脚本,而不仅仅是一个 script 。它应该支持start以及stop更多(参见Debian 政策
  • 脚本可以执行期间系统启动(您可以定义何时启动)。

crontab(因此@reboot)。

  • cron 将执行任何常规命令或脚本,这里没有什么特别的。
  • 任何用户都可以添加@reboot脚本(不仅仅是 root)
  • 在带有 systemd 的 Debian 系统上: cron 的 @reboot 在 期间执行multi-user.target
  • 在带有 SysV(不是 systemd)的 Debian 系统上,crontab(5) 提到:请注意,就 @reboot 而言,启动是 cron(8) 守护进程启动的时间。特别是,它可能是在某些系统守护程序或其他设施启动之前。这是由于机器的启动顺序造成的。
  • 在启动时和定期安排相同的脚本很容易。

/etc/rc.local通常被认为是丑陋的或不赞成的(至少被认为是红帽),但它仍然有一些不错的功能:

  • rc.local 将执行任何常规命令或脚本,这里没有什么特别的。
  • 在带有 SysV(不是 systemd)的 Debian 系统上:(rc.local几乎)是最后一个启动的服务。
  • 但在带有 systemd 的 Debian 系统上:默认rc.local会在之后执行(不是!)network.targetnetwork-online.target

关于 systemd 的network.targetnetwork-online.target,请阅读网络通后运行服务

答案2

首先,有必要澄清一下:

  • 初始化文件是存放服务控制脚本的目录,控制脚本可以控制服务的启动和停止,httpd例如cron
  • 本地文件是一项允许在系统启动过程中运行任意脚本的服务

至于使用脚本更好rc.local还是cron运行脚本更好,我怀疑这更多是一个美学问题,而不是实用性问题。cron作为任务调度程序,旨在作为一种对机器执行维护或保养的方法,例如检查更新、清理缓存或执行安全审核。这并不意味着它仅限于执行这些功能,因为它可以在指定时间运行所需的任何脚本或命令(例如@reboot)。

rc.local另一方面,使用则更多地属于系统配置类型的任务,rc.local因为由机器 init 系统执行,通常负责设置机器网络配置、服务或环境(但同样,不仅限于这个任务)。

然而,这两点都应该受到以下事实的影响:并非所有 init 系统都提供机制rc.local,也不是所有 cron 守护进程都提供@reboot伪标记。

奖励积分

如前所述,init.d该目录包含控制可以在系统上启动或停止的服务的脚本(至少在使用SysVinit 类型系统的计算机上)。根据您的 init 系统和脚本的用途,将脚本转换为初始化脚本以与服务相同的方式运行。然而,这在很大程度上取决于您的初始化系统,因为围绕如何构建这些文件的框架可能会有很大差异。

遗言

还应该注意的是,通常 bash 脚本以后缀.sh而不是结尾.txt,因为这立即表明该文件是 shell 脚本而不是文本文件。话虽这么说,只要它有一个舍邦( #!/bin/bash) 在文件顶部,或者称为 as bash /path/to/script.whatever,对于执行脚本来说应该不重要。

答案3

我在下面写下我的答案;

  1. 两者之间的主要区别是什么?

除了上面其他用户提到的差异之外,我想强调一点,@reboot 依赖于 crond 守护进程。您依赖于 crond 启动的顺序。虽然大多数情况下 crond 启动正常,但有时可能会启动失败(至少我在我的一些项目中见过一些失败)。当您编写初始化脚本时,如果您在脚本中做错了什么,通常会发生失败(例如:依赖于在您的服务之后启动的服务)

  1. 哪个更坚固?

基于以上,我认为 init 更健壮。但还有一点是“Franklin Piat”在第一个答案中提到的。通常您需要守护进程的初始化脚本,并且您应该遵循以下策略

  1. 两者中有更好的一个吗?

我不这么认为(rc.local 有点旧并且已弃用)

  1. 这是嵌入脚本以在引导期间运行的正确方法吗?

是的。通常应用程序/包编写者都会这样做。

相关内容