Sur une machine virtuelle Ubuntu (14.04), j'ai un serveur de nœud simple que je veux exécuter au démarrage. Le script suivant fonctionne lorsqu'il est appelé simplement en tant que ./noderoot start
, mais ne s'exécute pas au démarrage. Le script est
#!/bin/sh
### BEGIN INIT INFO
# Provides: noderoot
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: bootin and rootin
# Description: Start root server on boot
### END INIT INFO
export PATH=$PATH:/usr/bin
export NODE_PATH=$NODE_PATH:/home/azureuser/npm/bin
case "$1" in
start)
forever --sourceDir=/var/www/root -p /var/www/logs app.js
;;
stop)
forever stop --sourceDir=/var/www/root app.js
;;
*)
echo "Usage: /etc/init.d/noderoot {start|stop}"
exit 1
;;
esac
exit 0
Ce script réside dans /etc/init.d
avec 755
pour les autorisations. J'ai essayé de lancer update-rc.d
avec les résultats suivants:
root@linux-dev:~# update-rc.d noderoot defaults 80
Adding system startup for /etc/init.d/noderoot ...
/etc/rc0.d/K80noderoot -> ../init.d/noderoot
/etc/rc1.d/K80noderoot -> ../init.d/noderoot
/etc/rc6.d/K80noderoot -> ../init.d/noderoot
/etc/rc2.d/S80noderoot -> ../init.d/noderoot
/etc/rc3.d/S80noderoot -> ../init.d/noderoot
/etc/rc4.d/S80noderoot -> ../init.d/noderoot
/etc/rc5.d/S80noderoot -> ../init.d/noderoot
root@linux-dev:~# update-rc.d noderoot enable
update-rc.d: warning: start runlevel arguments (none) do not match noderoot Default-Start values (2 3 4 5)
update-rc.d: warning: stop runlevel arguments (none) do not match noderoot Default-Stop values (0 1 6)
Enabling system startup links for /etc/init.d/noderoot ...
Removing any system startup links for /etc/init.d/noderoot ...
/etc/rc0.d/K80noderoot
/etc/rc1.d/K80noderoot
/etc/rc2.d/S80noderoot
/etc/rc3.d/S80noderoot
/etc/rc4.d/S80noderoot
/etc/rc5.d/S80noderoot
/etc/rc6.d/K80noderoot
Adding system startup for /etc/init.d/noderoot ...
/etc/rc0.d/K80noderoot -> ../init.d/noderoot
/etc/rc1.d/K80noderoot -> ../init.d/noderoot
/etc/rc6.d/K80noderoot -> ../init.d/noderoot
/etc/rc2.d/S80noderoot -> ../init.d/noderoot
/etc/rc3.d/S80noderoot -> ../init.d/noderoot
/etc/rc4.d/S80noderoot -> ../init.d/noderoot
/etc/rc5.d/S80noderoot -> ../init.d/noderoot
Autant que je sache, cela s'est terminé avec succès. Je peux démarrer le service en exécutant Sudo service noderoot start
. Cependant, mon exécutable ne s'exécute pas au redémarrage de la machine. Y at-il un moyen de dépanner ce qui se passe? Un fichier journal particulier qui pourrait nous aider à résoudre ce problème?
En regardant les journaux sur /var/log/boot.log
(emplacement fourni par Letizia), j'ai trouvé une ligne très suspecte:
/etc/rc2.d/S80noderoot: 16: /etc/rc2.d/S80noderoot: forever: not found
La commande non trouvée a indiqué qu'il s'agissait d'un problème de chemin. Effectivement, les lignes
export PATH=$PATH:/usr/bin
export NODE_PATH=$NODE_PATH:/home/azureuser/npm/bin
ont été inversés. Changer ces variables pour pointer vers les bons répertoires, et ajouter un cd
au script avant d'exécuter forever
semble avoir résolu tous les problèmes rencontrés par le script d'exécution.