Quelle est la différence entre /etc/rc.local et /etc/init.d/rc.local?

30

Je veux ajouter une iptablesrègle permanente à ma nouvelle VPS, et après une brève recherche sur Google, j'ai été surpris qu'il y ait deux endroits où cette règle peut être ajoutée, qui semble identique: /etc/rc.localet /etc/init.d/rc.local. Peut-être que quelqu'un sait pourquoi il y a deux endroits pour placer un code de démarrage simple? Est-il spécifique à la saveur Linux (mais Ubuntu a les deux!)? Ou l'un d'entre eux est obsolète?

grigoryvp
la source
1
L'un devrait être un lien symbolique vers l'autre.
Ignacio Vazquez-Abrams
2
@ IgnacioVazquez-Abrams Sur Ubuntu Server 12.04 x86 LTS, ils sont complètement différents :(.
grigoryvp
1
@ IgnacioVazquez-Abrams: Sur Debian, ils semblent également différents.
Emanuel Berg
3
Il vaut la peine de vérifier: j'ai posé une question il y a /etc/rc.localquelque temps.
Emanuel Berg

Réponses:

31

/etc/init.dest maintenu sur ubuntu pour une compatibilité ascendante avec les choses sysvinit. Si vous regardez réellement, /etc/init.d/rc.localvous verrez (également à partir d'un serveur 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

Et "Exécuter /etc/rc.local" est exactement ce qu'il fait. L'intégralité de /etc/rc.localest:

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

J'imagine que le but en faisant cela est de fournir un endroit simple et mort pour mettre les commandes shell que vous voulez exécuter au démarrage, sans avoir à gérer le service stop | start, qui est dans /etc/init.d/rc.local.

Il s'agit donc en fait d'un service, et peut être exécuté en tant que tel. J'ai ajouté une echoligne à /etc/rc.localet:

»service rc.local start
hello world

Cependant, je ne pense pas qu'il soit référencé par quoi que ce soit dans le /etc/initrépertoire upstart (pas init.d!):

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

Il y a quelques services "rc" dans upstart:

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

Mais aucun de ceux-ci ne semble avoir quoi que ce soit à voir avec rc.local.

boucle d'or
la source
5

Il s'agit plus d'une chose spécifique à la distribution. (comme, vous ne trouverez pas différents rc.local dans CentOS).

Venons-en maintenant à votre question réelle, je pense que l'ajout de quoi que ce soit dans /etc/init.d/rc.local permet de démarrer en tant que "service" alors que tout ce qui se trouve dans /etc/rc.local lancerait simplement ce script au démarrage.

Je ne sais pas vraiment pourquoi Ubuntu maintient toujours les deux? (Peut-être que quelqu'un d'autre pourrait faire la lumière sur cette partie !!)

pragmatique
la source
Quelle est la différence entre une commande exécutée "en tant que service" et un code "simplement lancé au démarrage"? Est-ce une sécurité ou quoi?
grigoryvp
La principale différence entre les deux réside essentiellement dans un service et un processus. ;) Je suppose que l'intention de base serait uniquement la sécurité. Vous pourriez trouver ce lien intéressant: unixmen.com/managing-your-services-and-processes-in-linux
pragmatique
Ceci est une erreur! Ils ne sont pas le même script, mais ils sont un seul service - /etc/init.d/rc.locall'arrêt s'arrête-t-il /etc/rc.local(voir ma réponse pour plus de détails).
goldilocks
@goldilocks: Merci pour une réponse très descriptive et approfondie mais je ne sais pas quelle partie de ma réponse vous avez mentionnée incorrecte? Dire l'un en tant que service signifie qu'il peut faire les choses "démarrer" et "arrêter", tandis que l'autre est simplement un processus. Veuillez me corriger si je n'ai aucun sens ici.
pragmatique
2
@pragmatic Parce que le /etc/rc.localscript est le processus exécutable régi par le /etc/initd/rc.localscript, tout comme (par exemple) /bin/syslogserait le processus exécutable régi par /etc/initd/syslog. Vous dites explicitement que ce /etc/rc.localn'est qu'un script de démarrage, par opposition /etc/initd/rc.localà un service de niveau d'exécution complètement distinct.
goldilocks