Pourquoi la commande dans /etc/rc.local n’est-elle pas exécutée au démarrage?

39

Mon /etc/rc.localscript contient une seule commande censée démarrer le démon de mise à jour de Tiny Tiny RSS au démarrage, mais le script n'est pas exécuté au démarrage. Pourquoi?

L'ensemble du fichier /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.

/sbin/start-stop-daemon -b -c www-data:www-data -S -x /usr/bin/php /var/www/ttrss/update_daemon2.php -- -quiet

exit 0

/etc/rc.local est exécutable:

# ls -l /etc/rc.local
-rwxr-xr-x 1 root root 342 May 25 16:14 /etc/rc.local

/etc/init.d/rc.local existe et est exécutable:

# ls -l /etc/init.d/rc.local
-rwxr-xr-x 1 root root 801 Jul 27  2012 /etc/init.d/rc.local

/etc/init.d/rc.local est supposé être exécuté au démarrage pour ce niveau d'exécution:

# runlevel 
N 2
# ls -l /etc/rc2.d/S99rc.local 
lrwxrwxrwx 1 root root 18 Sep 22  2012 /etc/rc2.d/S99rc.local -> ../init.d/rc.local

Si j'appelle manuellement /etc/rc.local à partir de la ligne de commande, update_daemon se charge ...

# /etc/rc.local
# ps ax | grep update_daemon2.php
2233 ?        S      0:00 /usr/bin/php /media/sda5/www/news/update_daemon2.php -quiet
2234 ?        S      0:00 /usr/bin/php /media/sda5/www/news/update_daemon2.php -quiet

... ce que je dois me rappeler de faire chaque fois que mon serveur redémarre jusqu'à ce que ce problème soit résolu.

Des questions similaires existent déjà , mais je n’ai pas encore pu appliquer les informations qu’il contient à mon problème spécifique.

Pourquoi la commande dans rc.local n'est-elle pas exécutée au démarrage?

xx
la source
Peut être dû au requirettyréglage. Lorsque vous êtes connecté, vous exécutez le script en mode TTY, mais lors du démarrage du système, ce n'est pas en mode TTY. Ce lien peut vous aider à shell-tips.com/2014/09/08/… Merci.
KICT

Réponses:

23

rc.localLe script se ferme si une erreur survient lors de l'exécution de l'une de ses commandes (mentionnez l' -eindicateur dans #!/bin/sh -e).

Il est possible que certaines conditions préalables ne soient pas remplies lorsque vous essayez d'exécuter vos commandes au moment de l' rc.localexécution. Par conséquent, l'exécution de votre commande échoue.

J'ai rencontré la même chose lors de la configuration manuelle du gouverneur cpu sans y parvenir rc.local. Voici ma solution de contournement personnalisée, qui consiste update-rc.dà exécuter vos commandes au démarrage:

  1. Créez un fichier myscript.shdans le répertoire /etc/init.davec un en-tête:#!/bin/sh
  2. Mettez vos commandes personnalisées comme contenu
  3. Rendez-le exécutable: sudo chmod +x /etc/init.d/myscript.sh
  4. Créez des liens symboliques pour votre script pour différents niveaux d'exécution: sudo update-rc.d myscript.sh defaults

Vous pouvez également vérifier les /etc/network/if-up.dscripts et voir si vous pouvez déclencher vos commandes au démarrage de la mise en réseau.

A dessiné
la source
Merci pour la réponse. Ma configuration a changé depuis que j'ai posté la question. Je ne peux donc pas vérifier si votre réponse aurait résolu le problème.
xx
S'il vous plaît dites-moi ce que l'étape 4 fait? Je suis nouveau àupdate-rc.d
Mohith7548
7

j'ai eu un problème similaire dans rc.local ne pas exécuter au démarrage

sshades m'a fourni la réponse suivante:

Ubuntu utilise maintenant systemd, et rc.local est maintenant considéré comme un service qui est désactivé par défaut. Vous pouvez activer "rc.local" en entrant la commande suivante et en redémarrant:

sudo systemctl enable rc-local.service

https://askubuntu.com/a/770033/395498

Bien que je n'aie pas testé sa solution, je pense que cela semble logique et que cela fonctionnera. Toutefois :

J'ai également trouvé une solution qui ajoute un script à ./.config/autostart-scripts/ fera l'affaire

Diet Bos
la source
7
Obtenir cette erreur. Les fichiers d'unité n'ont pas de configuration d'installation (WantedBy, RequiredBy, ainsi que les paramètres d'alias dans la section [Installer] et DefaultInstance pour les unités modèles). Cela signifie qu'ils ne sont pas censés être activés à l'aide de systemctl. Les raisons possibles pour avoir ce type d'unités sont les suivantes: 1) Une unité peut être activée statiquement en étant liée de manière symbolique à partir du répertoire .wants / ou .requires / d'une autre unité. 2) Le but d'une unité peut être d'agir comme aide pour une autre unité qui dépend de ses besoins.
Rıfat Erdem Sahin
Je reçois aussi cette erreur. Si rc.localest désactivé, quelle est l'alternative?
Ben le
5

essayer sudo sysv-rc-confet vérifier si rc.localest activé

rc.local         [ ]   [x]   [x]   [x]   [x]   [ ]   [ ]   [ ]
zuba
la source
Oui, c'est activé.
xx
cette commande doit-elle être installée?
jcollum
1
@jcollum Oui, il s'agit d'un programme provenant d'un paquet portant le même nom. Pour installer, tapezsudo apt install sysv-rc-conf
banan3'14
rc.localn'est même pas dans ma liste de services!
Ben le
5

Assurez-vous que le script rc.local est exécutable:

sudo chmod +x /etc/rc.local

Ensuite, activez-le:

sudo systemctl enable rc-local.service

Redémarrez le système ou démarrez le script manuellement en lançant:

sudo systemctl start  rc-local.service

Le statut du service peut être affiché en exécutant:

$ sudo systemctl status rc-local.service
 rc-local.service - /etc/rc.local Compatibility
   Loaded: loaded (/lib/systemd/system/rc-local.service; static; vendor preset: enabled) 
Drop-In: /lib/systemd/system/rc-local.service.d
           └─debian.conf
   Active: active (running) since Mon 2018-04-02 10:39:44 -03; 1s ago
  Process: 2044 ExecStart=/etc/rc.local start (code=exited, status=0/SUCCESS)
 Main PID: 2049 (svscanboot)
Tasks: 3
 Memory: 556.0K
CPU: 10ms
CGroup: /system.slice/rc-local.service
Léobocao
la source
Vous n'avez pas besoin d'activer manuellement le service. Si le fichier existe et est exécutable, systemd activera automatiquement le rc-localservice.
muru
4

Nous avons eu ce problème sur certains serveurs hébergés chargeant des règles FW.

Sur ces boîtes, ils redémarrent TRÈS rapidement et nous avons trouvé qu'il suffisait de mettre un "sommeil 1" dans rc.local avant que les instructions de chargement ne semblent résoudre le problème. Je suppose que cela a laissé un peu de temps pour que les interfaces se règlent avant de charger les règles FW.

Simon Hart
la source
1
Merci. sleep 1résolu mon problème. Intéressant, j'ai beaucoup de serveurs mais un seul a ce problème.
Qian Chen
1

Une fois, j'ai édité rc.localavec Notepad dans Windows et il a commencé à avoir ce problème.

Dans ce cas, l'utilisation d'un éditeur de texte prenant en charge la conversion EOL, telle que Notepad ++, pour convertir le style EOL en "Unix", peut résoudre le problème.

Vous pouvez aussi le faire par :set ff=unixdans Vim.

SyaSyaNown
la source
1

J'ai trouvé dans les conteneurs Ubuntu LXC que si Rc.Local a un shebang parfaitement correct par exemple

#!/bin/sh

cela échoue, mais si vous supprimez le shebang, cela fonctionne.

Pas au courant de pourquoi ou de quel shell il utilise je pense qu'il bombe sur le premier non-zéro aussi. (Dans d'autres installations d'Ubuntu, le bon shebang n'est pas un problème)

teknopaul
la source
0

Vous devrez vous assurer que cela /etc/rc.localest exécuté lors du démarrage du serveur avec la commande:

sudo systemctl enable rc-local.service

William
la source