Qual é a diferença entre /etc/rc.local e /etc/init.d/rc.local?

30

Quero adicionar uma iptablesregra permanente à minha nova VPSe, após uma breve pesquisa no Google, fiquei surpreso ao saber que existem dois lugares em que essa regra pode ser adicionada, que parece idêntica: /etc/rc.locale /etc/init.d/rc.local. Talvez alguém saiba por que dois lugares para colocar um código de inicialização simples? É específico para o linux (mas o ubuntu possui os dois!)? Ou um deles está obsoleto?

grigoryvp
fonte
11
Um deve ser um link simbólico para o outro.
Ignacio Vazquez-Abrams
2
@ IgnacioVazquez-Abrams No Ubuntu Server 12.04 x86 LTS eles são completamente diferentes :(.
grigoryvp
11
@ IgnacioVazquez-Abrams: No Debian, eles parecem ser diferentes também.
Emanuel Berg
3
Vale a pena conferir: fiz uma pergunta/etc/rc.localum tempo.
Emanuel Berg

Respostas:

31

/etc/init.dé mantido no ubuntu para compatibilidade com versões anteriores do sysvinit. Se você realmente olhar, /etc/init.d/rc.localverá (também de um servidor LTS 12.04):

#! /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

E "Executar /etc/rc.local" é exatamente o que ele faz. A totalidade /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

Eu acho que o objetivo disso é fornecer um local simples e simples para colocar os comandos do shell que você deseja executar na inicialização, sem precisar lidar com o material de serviço stop | start, que está dentro /etc/init.d/rc.local.

Portanto, é de fato um serviço e pode ser executado como tal. Eu adicionei uma echolinha para /etc/rc.locale:

»service rc.local start
hello world

No entanto, eu não acredito que seja referenciado por qualquer coisa no /etc/initdiretório do iniciante (não init.d!):

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

Existem alguns serviços "rc" no inicio:

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

Mas nenhum deles parece ter algo a ver com rc.local.

Cachinhos Dourados
fonte
5

Isso é mais uma coisa específica da distribuição. (como, você não encontrará rc.local diferente no CentOS).

Agora, voltando à sua pergunta real, acho que adicionar qualquer coisa dentro do /etc/init.d/rc.local faz com que ele comece como um "serviço", enquanto que qualquer coisa dentro do /etc/rc.local simplesmente iniciaria o script no momento da inicialização.

Não tenho muita certeza de por que o Ubuntu ainda mantém os dois? (Talvez alguém possa lançar alguma luz sobre essa parte !!)

pragmático
fonte
Qual é a diferença entre o comando que é executado "como um serviço" e um código que é "simplesmente iniciado no momento da inicialização"? É alguma segurança ou o quê?
grigoryvp
A principal diferença entre os dois é essencialmente um Serviço e um processo. ;) Acho que a intenção básica seria apenas segurança. Você pode achar este link interessante: unixmen.com/managing-your-services-and-processes-in-linux
pragmatic
Isso está incorreto! Eles não são o mesmo script, mas são um serviço - /etc/init.d/rc.locala parada inicia as coisas /etc/rc.local(veja minha resposta para mais detalhes).
Goldilocks
@goldilocks: Obrigado por uma resposta muito descritiva e completa, mas não estou claro qual parte da minha resposta você referiu estar incorreta? Dizer um como serviço significa que ele pode executar as coisas "iniciar" e "parar", enquanto o outro é simplesmente um processo. Por favor, corrija-me se não fizer sentido aqui.
pragmático
2
@pragmatic Como o /etc/rc.localscript é o processo executável controlado pelo /etc/initd/rc.localscript, assim como (por exemplo) /bin/syslogseria o processo executável controlado pelo /etc/initd/syslog. Você diz explicitamente que /etc/rc.localé apenas um script de inicialização, /etc/initd/rc.localsendo um serviço em nível de execução completamente separado.
goldilocks