在启动/启动过程中运行脚本;init.d和cron @reboot


48

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

使用的@reboot(这种方法中提到的这个论坛hs.chandra)是一些什么比较简单,通过简单地进入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每次引导系统时也应运行该结果。

Q1:两者之间的主要区别是什么?
Q2:哪个更强大?
Q3:两者中有更好的一个吗?
Q4:这是嵌入脚本以在引导过程中运行的正确方法吗?

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


2
同样相关的是systemd,link1 link2
Rufus

Answers:


37

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通常被认为是丑陋或不推荐使用的(至少是redhat),但它仍然具有一些不错的功能:

  • rc.local将执行任何常规命令或脚本,此处无特殊之处。
  • 在具有SysV(不是systemd)的Debian系统上rc.local:(几乎)是最后一个启动的服务。
  • 但是在具有systemd的Debian系统上:默认情况下rc.local执行network.target(不是network-online.target!)

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


在我的Ununtu 16.04中,/var/run/crond.reboot如果我希望每次系统启动时都执行@reboot cron作业,则每次都需要删除文件。如果此文件existis @reboot cron作业将不会被执行
阿尔伯特加泰罗尼亚语

@ Albert-Catala向Ubuntu提交错误!
富兰克林·皮亚特

12

首先,需要进行澄清:

  • init.d是存储服务控制脚本的目录,该脚本控制诸如httpd或的服务的启动和停止。cron
  • rc.local是一项服务,允许在系统启动过程中运行任意脚本

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

使用rc.local,而另一方面,将属于一个系统配置类型的任务中更多,因为rc.local,由机器正在执行初始化系统,一般用于设置机器的网络配置,服务或环境中(但同样,不局限于只这个任务)。

但是,并非所有的init系统都提供一种rc.local机制,也不是所有的cron守护程序都提供一个@rebootpsuedo标签,因此可以控制这两个方面。

奖励积分

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

遗言

还应注意,bash脚本通常以后缀.sh而不是结束.txt,因为这立即表明该文件是Shell脚本而不是文本文件。话虽如此,只要它在文件的顶部具有shebang#!/bin/bash)或称为bash /path/to/script.whatever,就执行脚本而言无关紧要。


bash脚本通常不以扩展名结尾(并且可以说不应sh扩展名结尾
mikeserv

1
@mikeserv:虽然我同意大多数bash脚本都没有扩展名(并且可以说不应具有任何扩展名),但是通常带有“ .sh”扩展名的文件都是bash脚本-请参阅“什么是.sh文件?”
大卫·卡里

@DavidCary-似乎不是非常权威的资源。
mikeserv

1
Wikipedia:“文件扩展名列表”Wikipedia:“ shell脚本”还提到了带有参考的令人惊讶的常见“ .sh”扩展名。
大卫·卡里

1
通常bash脚本以后缀.sh而不是.txt结尾 -具体来说,sh作为bash脚本(或其他shell脚本)的文件扩展名,其含义比txt通常表示纯文本的更为准确。您可以使用任何使您咯咯笑的扩展名,但是如果使用扩展名sh更合适并且更常用,则可以采用常规约定。尽管不是必需的,尤其是对于打算从中执行的脚本PATH
愤怒

3

我在下面写我的答案;

Q1:两者之间的主要区别是什么?

除了上述其他用户提到的差异外,我想强调一点,@ reboot依赖于crond守护程序。您取决于crond启动的顺序。尽管在大多数情况下,crond可以很好地启动,但是它有时可能无法启动(至少我在一些项目中看到了一些失败)。当您编写一个初始化脚本时,如果您在脚本中执行了某些错误操作(例如,依赖于将在服务之后启动的服务),通常会发生故障。

Q2:哪个更强大?

基于以上所述,我认为init更为健壮。但是,“富兰克林·皮亚特”在第一个答案中提到了另一点。通常,您需要守护程序的初始化脚本,并且应该遵循该策略

Q3:两者中有更好的一个吗?

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

Q4:这是嵌入脚本以在引导过程中运行的正确方法吗?

是。通常,应用程序/程序包编写者以这种方式执行。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.