В чем разница между /etc/rc.local и /etc/init.d/rc.local?

30

Я хочу добавить постоянное iptablesправило к моему новому VPS, и после короткого поиска в Google я был удивлен, что есть два места, где это правило может быть добавлено, которое кажется идентичным: /etc/rc.localи /etc/init.d/rc.local. Может быть, кто-то знает, почему два места для размещения простого кода запуска? Это специфический вкус Linux (но в Ubuntu есть оба!)? Или один из них устарел?

grigoryvp
источник
1
Один должен быть символической ссылкой на другой.
Игнасио Васкес-Абрамс
2
@ IgnacioVazquez-Abrams На Ubuntu Server 12.04 x86 LTS они совершенно разные :(.
grigoryvp
1
@ IgnacioVazquez-Abrams: В Debian они тоже разные.
Эмануэль Берг
3
Стоит проверить: Я задал вопрос о том, /etc/rc.localнекоторое время назад.
Эмануэль Берг
Возможный дубликат В чем разница между /etc/rc.d/rc*.d и /etc/rc*.d
n611x007

Ответы:

31

/etc/init.dподдерживается в Ubuntu для обратной совместимости с sysvinit. Если вы действительно посмотрите, /etc/init.d/rc.localто увидите (также с сервера 12.04 LTS):

#! /bin/sh
### BEGIN INIT INFORMATION
# Provides:          rc.local
# Required-Start:    $remote_fs $syslog $all
# Required-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:
# Short-Description: Run /etc/rc.local if it exist
### END INIT INFO

И «Run /etc/rc.local» это именно то, что он делает. В целом /etc/rc.localэто:

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

exit 0

Я предполагаю, что цель этого состоит в том, чтобы предоставить простое место для размещения команд оболочки, которые вы хотите запустить при загрузке, без необходимости иметь дело с сервисом остановки | запуска, который находится внутри /etc/init.d/rc.local.

Так что на самом деле это сервис, и его можно запускать как таковой. Я добавил echoстроку в /etc/rc.localи:

»service rc.local start
hello world

Однако я не верю, что на него ссылается что-либо в /etc/initкаталоге upstart (не init.d!):

»initctl start rc.local
initctl: Unknown job: rc.local

В upstart есть несколько "rc" сервисов:

»initctl list | grep rc
rc stop/waiting
rcS stop/waiting
rc-sysinit stop/waiting

Но ни один из них не имеет ничего общего с rc.local.

лютик золотистый
источник
5

Это больше специфическая вещь для дистрибутива. (например, вы не найдете другой rc.local в CentOS).

Теперь, перейдя к вашему актуальному вопросу, я думаю, что добавление чего-либо в /etc/init.d/rc.local делает его запуск «службой», тогда как все, что в /etc/rc.local, просто запускает этот скрипт во время загрузки.

Я не совсем уверен, почему Ubuntu все еще поддерживает их обоих? (Возможно, кто-то еще может пролить свет на эту часть !!)

прагматический
источник
В чем разница между командой, которая выполняется "как служба", и кодом, который "просто запускается во время загрузки"? Это какая-то безопасность или что?
Григорьев В.П. 31.12.12
Основное различие между ними состоит в основном из службы и процесса. ;) Я предполагаю, что основной целью будет только безопасность. Вы можете найти эту ссылку интересной: unixmen.com/managing-your-services-and-processes-in-linux
прагматичный
Это неверно! Это не один и тот же сценарий, но это один сервис - /etc/init.d/rc.localон останавливает запуск /etc/rc.local(подробности см. В моем ответе).
Златовласка
@goldilocks: Спасибо за очень подробный и подробный ответ, но мне не ясно, какую часть моего ответа вы назвали неверной? Сказать, что один из них - сервис, означает, что он может выполнять «запуск» и «остановку», а другой - просто как процесс. Пожалуйста, поправьте меня, если я не вижу здесь смысла.
прагматичный
2
@pragmatic Поскольку /etc/rc.localскрипт - это исполняемый процесс, управляемый /etc/initd/rc.localскриптом, точно так же, как (например) /bin/syslogбудет исполняемый процесс, которым управляет /etc/initd/syslog. Вы прямо говорите, что /etc/rc.localэто просто загрузочный скрипт, а /etc/initd/rc.localне отдельный сервис уровня выполнения.
Златовласка