我目前正在尝试了解在系统启动/引导时运行脚本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
- 两者之间的主要区别是什么?
- 哪个更坚固?
- 两者中有更好的一个吗?
- 这是嵌入脚本以在引导期间运行的正确方法吗?
我将合并一个 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.target
network-online.target
关于 systemd 的network.target
和network-online.target
,请阅读网络通后运行服务。
答案2
首先,有必要澄清一下:
- 初始化文件是存放服务控制脚本的目录,控制脚本可以控制服务的启动和停止,
httpd
例如cron
- 本地文件是一项允许在系统启动过程中运行任意脚本的服务
至于使用脚本更好rc.local
还是cron
运行脚本更好,我怀疑这更多是一个美学问题,而不是实用性问题。cron
作为任务调度程序,旨在作为一种对机器执行维护或保养的方法,例如检查更新、清理缓存或执行安全审核。这并不意味着它仅限于执行这些功能,因为它可以在指定时间运行所需的任何脚本或命令(例如@reboot
)。
rc.local
另一方面,使用则更多地属于系统配置类型的任务,rc.local
因为由机器 init 系统执行,通常负责设置机器网络配置、服务或环境(但同样,不仅限于这个任务)。
然而,这两点都应该受到以下事实的影响:并非所有 init 系统都提供机制rc.local
,也不是所有 cron 守护进程都提供@reboot
伪标记。
奖励积分
如前所述,init.d
该目录包含控制可以在系统上启动或停止的服务的脚本(至少在使用SysV
init 类型系统的计算机上)。根据您的 init 系统和脚本的用途,将脚本转换为初始化脚本以与服务相同的方式运行。然而,这在很大程度上取决于您的初始化系统,因为围绕如何构建这些文件的框架可能会有很大差异。
遗言
还应该注意的是,通常 bash 脚本以后缀.sh
而不是结尾.txt
,因为这立即表明该文件是 shell 脚本而不是文本文件。话虽这么说,只要它有一个舍邦( #!/bin/bash
) 在文件顶部,或者称为 as bash /path/to/script.whatever
,对于执行脚本来说应该不重要。
答案3
我在下面写下我的答案;
- 两者之间的主要区别是什么?
除了上面其他用户提到的差异之外,我想强调一点,@reboot 依赖于 crond 守护进程。您依赖于 crond 启动的顺序。虽然大多数情况下 crond 启动正常,但有时可能会启动失败(至少我在我的一些项目中见过一些失败)。当您编写初始化脚本时,如果您在脚本中做错了什么,通常会发生失败(例如:依赖于在您的服务之后启动的服务)
- 哪个更坚固?
基于以上,我认为 init 更健壮。但还有一点是“Franklin Piat”在第一个答案中提到的。通常您需要守护进程的初始化脚本,并且您应该遵循以下策略
- 两者中有更好的一个吗?
我不这么认为(rc.local 有点旧并且已弃用)
- 这是嵌入脚本以在引导期间运行的正确方法吗?
是的。通常应用程序/包编写者都会这样做。