/etc/rc.local的用途和典型用法


73

标头看起来像这样:

#!/bin/sh -e
#
# rc.local - executed at the end of each multiuser runlevel
#
# Make sure that the script will "exit 0" on success or any other
# value on error.

这个文件的原因是什么(它包含的内容不多),通常您会输入什么命令?什么是“多用户运行级别”?(我猜rc是“运行命令”吗?)


2
我不知道这是否是文件的“官方”目的,但我发现我可以将文件用于启动时应该发生的情况,并且需要超级用户访问权限,而无需提供密码。这通常涉及颜色,键盘和其他类似的东西。在此处查看一些示例。
伊曼纽尔·伯格

Answers:


66

运行级别是系统的状态,指示是否它是在启动或重新引导或关闭,或在单用户模式或正常运行的过程。传统的init程序通过切换到相应的运行级别来处理这些动作。在Linux下,运行级别按惯例是

  • S在启动时,
  • 关闭时为0,
  • 6重启时,
  • 1在单用户模式下,
  • 正常操作中2至5。

运行级别2到5被称为多用户运行级别,因为它们允许多个用户登录,而运行级别1仅适用于系统管理员。

当运行级别更改时,init将运行rc脚本(在具有传统init的系统上,还有其他选择,例如UpstartSystemd)。这些rc脚本通常启动和停止系统服务,并由发行版提供。

该脚本/etc/rc.local供系统管理员使用。传统上,它是在所有正常系统服务启动之后,切换到多用户运行级别的过程结束时执行的。您可以使用它来启动自定义服务,例如安装在中的服务器/usr/local。大多数安装不需要/etc/rc.local,仅在少数需要的情况下提供。


2
我今天发现,在当前的FreeBSD上,rc.local可能很早就被执行了。绝对不会在所有正常系统服务启动之后。我希望在可以通过sshd访问无头计算机时发出提示音,并且rc.local由于这个原因不适合使用。由于最初的问题是关于Debian的,因此此评论可能与OP无关。
MvG

1
@MvG感谢您提供信息。rc.local传统上是最后一次运行,但是当他们切换到基于依赖项的系统时,我看到FreeBSD停止这样做。请注意,即使在rc.local之后调用/etc/rc.d/sshd,也无法完美运行:rc.local将在sshd进程启动后立即调用,也可以在sshd开始侦听网络之前调用它(但我们会在十分之一秒的时间进行讨论)最典型的情况下)。
Gilles

我正在尝试使用它为lxc容器设置网络并自动启动它们。但是之后就停止了iptables-apply /root/iptables。我正在找出问题所在(等待下一次重新启动)。但是,如果您有任何建议,我会很高兴。
x-yuri

1
@ x-yuri这比您在此处发布的内容需要更多的信息。我什至不知道“它停止”中的“它”是什么。提出一个新问题,解释您的工作。
吉尔斯(Gilles)

14

rc 表示“运行控制”,

multiuser运行级别将被定义为网络可用,因此到服务器的连接可以代替硬线连接控制台的使用这些服务进行所在的级别。

请注意,服务器通常由服务处理器(使用各种名称)进行管理,这些处理器确实支持网络连接,并且反过来又好像您确实有一个硬连线的控制台。

对于rc.local文件,这是方便的操作,允许您指定要启动的所有“本地”(特定于站点的)对象(守护程序和/或启动一次脚本)。您可以选择使用此范例,也可以适当地使用启动/停止脚本实际填充'/etc/init.d'。


1
好的,但是为什么文件在那里,您通常在什么时候使用它,以及如何使用(例如,哪些命令有意义)?
伊曼纽尔·伯格

4

我主要将其用于两件事:

  1. 记录每次重新启动的日期和内核版本。一个简单的单行代码,可以轻松地将其添加到系统中,而不会造成任何麻烦……并且比运行时更容易破坏启动历史记录uptimed

  2. 恢复几年前曾经在debian中使用的旧/etc/rc.boot/目录。我仍然有一些简单的脚本,不值得将其重写为init.d脚本(例如,将Dmesg邮寄到root的Q&D脚本,以及另一个使用hdaparm禁用空闲spindown和blockdev设置为read-的脚本。大小),我很高兴能在所有其他启动时脚本之后运行它们。

例如

echo "$(date +%s),$(date),$(uname -a)"  >> /var/log/reboot.log

[ -d /etc/rc.boot ] && run-parts /etc/rc.boot

另外,我在今年早些时候为centos和debian发行版编写了/etc/rc.local脚本,以从openstack上获取ec2风格的元数据(在上http://169.254.169.254/),以便VM可以获取其IP,主机名,ssh密钥和其他特定于实例的信息。 。此后已将cloud-init移植到这些发行版,因此脚本现在已过时。


3

Debianrc.local上的文件主要是为了与非初始样式系统兼容。您不应该使用它。

相反,建议您/etc/init.d/Skeleton更改运行级别时将要复制的内容复制到新的初始化脚本中,然后使用inserv启用它。


更新:根据下面的评论,不再建议此答案。但是,这个答案是在骨架淘汰之前的几年发布的,并且直到2019年1月,骨架仍存在于 Debian不稳定环境中。


unix.stackexchange.com/a/480897/5132 /etc/init.d/skeleton不是这样。
JdeBP '18年
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.