Exécutez script avec rc.local: script fonctionne, mais pas au démarrage

j'ai un nœud.js script qui doivent se lancer au démarrage et exécutez sous l'utilisateur www-data. Pendant le développement, j'ai toujours commencé le script:

su www-data -c 'node /var/www/php-jobs/manager.js

j'ai vu exactement ce qui s'est passé, le gestionnaire.js fonctionne maintenant très bien. J'ai cherché et j'ai trouvé que je devais placer ceci dans mon /etc/rc.local. De plus, j'ai appris à pointer la sortie vers un fichier log et à ajouter le 2>&1 à "rediriger stderr vers stdout" et ça devrait être un démon donc le dernier caractère est un &.

Enfin, mon /etc/rc.local ressemble à ceci:

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

su www-data -c 'node /var/www/php-jobs/manager.js >> /var/log/php-jobs.log 2>&1 &'

exit 0

Si je lance moi-même (sudo /etc/rc.local): oui, ça marche! Cependant, si je fais un redémarrage Non node processus est en cours,/var/log/php-jobs.log n'existe pas et ainsi, le manager.js ne fonctionne pas. Ce qui se passe?

33
demandé sur Jurian Sluiman 2011-10-16 13:10:07

15 réponses

dans cet exemple de rc.script local j'utilise la redirection io à la toute première ligne d'exécution vers mon propre fichier log:

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

exec 2> /tmp/rc.local.log  # send stderr from rc.local to a log file
exec 1>&2                      # send stdout to the same log file
set -x                         # tell sh to display commands before execution

/opt/stuff/somefancy.error.script.sh

exit 0
65
répondu John Doe 2017-05-11 18:27:36

On some linux (Centos & RH, e.g.),/etc/rc.local n'est au départ qu'un lien symbolique vers /etc/rc.d/rc.local. Sur ces systèmes, si le lien symbolique est cassé, et /etc/rc.local est un fichier séparé, puis change en /etc/rc.local n'obtiendrez pas vu lors de l'initialisation -- le processus de démarrage d'exécuter la version /etc/rc.d. (Ils fonctionneront si on court!--0--> manuellement, mais ne sera pas exécuté au démarrage.)

on dirait que sur le système de dimadima, ce sont des fichiers séparés, mais /etc/rc.d/rc.local appelle /etc/rc.local

le lien symbolique à partir d' /etc/rc.local la 'vraie' un /etc/rc.d peut se perdre si l'on passe rc.local à un répertoire de sauvegarde et le copie en arrière ou le crée à partir de zéro, ne réalisant pas l'original en /etc n'était qu'un lien symbolique.

10
répondu user3533658 2014-04-14 21:22:15

j'ai fini avec arriviste, qui fonctionne très bien.

5
répondu Jurian Sluiman 2011-11-30 19:05:52

dans Ubuntu j'ai remarqué qu'il y a 2 fichiers. Le réel est /etc/init.d/rc.local; il semble que les autres /etc/rc.local est faux?

une fois que j'ai modifié le bon (/etc/init.d/rc.local) il s'est exécuté comme prévu.

4
répondu Boyan 2012-12-02 22:56:16

vous auriez pu aussi le faire fonctionner en spécifiant le chemin complet vers le noeud. De plus, lorsque vous voulez exécuter une commande shell en tant que démon, vous devez fermer stdin en ajoutant 1<&- avant le &.

3
répondu w00t 2011-10-16 14:08:52

si vous utilisez linux sur cloud, vous n'avez généralement pas la possibilité de toucher le matériel réel en utilisant vos mains. donc vous ne voyez pas l'interface de configuration lors du démarrage pour la première fois, et bien sûr ne pouvez pas la configurer. En conséquence, le firstboot service sera toujours dans le bon chemin rc.local. La solution est de désactiver firstboot en faisant:

sudo chkconfig firstboot off

si vous n'êtes pas sûr pourquoi votre rc.local ne fonctionne pas, vous pouvez toujours vérifier à partir de /etc/rc.d/rc fichier car ce fichier toujours exécuter et appeler d'autres sous-systèmes (par exemple rc.local.)

2
répondu superyuan 2014-12-08 14:13:19

j'ai eu le même problème (sur CentOS 7) et je l'ai corrigé en donnant les permissions d'exécution à /etc/local:

chmod +x /etc/rc.local
2
répondu Gayolomao 2015-03-25 09:58:30

j'ai eu mon script fonctionne en modifiant /etc/rc.local puis l'émission des 3 commandes suivantes.

sudo mv /filename /etc/init.d/
sudo chmod +x /etc/init.d/filename 
sudo update-rc.d filename defaults

Maintenant, le script fonctionne au démarrage.

1
répondu CatGuyTX 2013-04-25 06:26:40

J'utilise CentOS 7.

$ cd  /etc/profile.d

$ vim yourstuffs.sh

Tapez ce qui suit dans le yourstuffs.sh script.

Tapez tout ce que vous voulez ici pour exécuter

export LD_LIBRARY_PATH=/usr/local/cuda-7.0/lib64:$LD_LIBRARY_PATH

enregistrer et redémarrer le système D'exploitation.

1
répondu lppier 2015-05-29 03:09:22

Ceci est très probablement causé par une variable d'environnement de chemin manquante ou incomplète.

si vous fournissez des chemins absolus complets vers vos exécutables (su et node), cela fonctionnera.

0
répondu Asad R. 2013-05-22 05:42:29

je comprends que si vous placez votre script dans un certain niveau D'exécution, vous devriez utiliser ln-s pour lier le script au niveau dans lequel vous voulez qu'il fonctionne.

0
répondu RVQ 2016-05-16 18:09:51

j'ai utilisé rc.local dans le passé. Mais j'ai appris de mon expérience que le moyen le plus fiable pour exécuter votre script au démarrage du système est d'utiliser @reboot commande crontab. Par exemple:

@reboot path_to_the_start_up_script.sh
0
répondu Heapify 2018-02-12 23:59:36

tout d'abord, rendre le script exécutable en utilisant sudo chmod 755 /path/of/the/file.sh Maintenant, ajoutez le script dans la rc.local sh /path/of/the/file.sh avant la sortie 0 dans la rc.local, ensuite, faites le rc.local à exécutable avec sudo chmod 755 /etc/rc.local suivante pour initialiser le rc.l'utilisation locale sudo /etc/init.d/rc.local start cela va lancer la rc.local maintenant, redémarrez le système. Faire..

0
répondu nikhil parashar 2018-08-21 11:02:38

1 ne recommande pas l'utilisation de root pour exécuter les applications telles que node app.

eh Bien, vous pouvez le faire, mais peut attraper plus d'exceptions.

2 La rc.local fonctionne normalement en tant qu'utilisateur root.

donc si votre script s'exécute comme un autre utilisateur tel que www U doit s'assurer que le chemin et l'autre environnement sont ok.

3-je trouver un moyen facile d'exécuter un service en tant qu'utilisateur:

sudo -u www -i /le/chemin/de/votre/script

s'il vous plaît préférez le sudo manuel~ -je [commande] L'option-i (simulate initial login) exécute le shell spécifié par l'entrée de la base de données de mots de passe de l'utilisateur cible comme loginshell...

-1
répondu fantaxy025025 2014-07-29 08:57:07

rc.local ne fonctionne qu'au démarrage. Si vous redémarrez et que vous voulez que le script s'exécute, il doit aller dans le rc.0 fichier commençant par le préfixe K99.

-3
répondu Jason 2013-08-22 21:37:13