web-dev-qa-db-fra.com

Forever + Nodemon fonctionnant ensemble

Existe-t-il un moyen de faire fonctionner ces deux packages ensemble?

Donc, fondamentalement, je veux avoir le meilleur des deux mondes. Exécution automatique du serveur (et redémarrage en cas d'erreur) et mises à jour automatiques en cas de modification du fichier .js.

46
Patrik Fuhrmann

Toxa était sur la bonne voie, le problème que cfogelberg soulevé est valide, mais pour éviter ce problème, vous pouvez faire ce qui suit:

forever -c "nodemon --exitcrash" app.js

cela permet de s'assurer que nodemon se ferme réellement (plutôt que de vous donner le message "application plantée"), puis forever le reprend.

Dans forever --help cette -c spécifie une commande à exécuter, sinon elle utilise par défaut le nœud. Sans -c résulte l'erreur qui est mentionnée dans les commentaires de cette réponse.

45
Jubair

Vous devriez exécuter quelque chose comme ça

forever start -c nodemon app.coffee
63
Anton Borodatov

Il y a une entrée à ce sujet dans la nodemon FAQ :

Si vous utilisez nodemon avec pour toujours (peut-être dans un environnement de production), vous pouvez combiner les deux ensemble. De cette façon, si le script se bloque, redémarre définitivement le script et s'il y a des modifications de fichier, nodemon redémarre votre script. Pour plus de détails, voir numéro .

Pour ce faire, vous devez ajouter les éléments suivants lors de l'appel à forever:

  • Utilisez pour toujours -c nodemon option pour indiquer pour toujours d'exécuter nodemon au lieu de node.
  • Inclure le nodemon --exitcrash flag pour s'assurer que nodemon se ferme si le script plante (ou se ferme de façon inattendue).
  • Indiquez pour toujours d'utiliser SIGTERM au lieu de SIGKILL lorsque vous demandez à nodemon de s'arrêter. Cela garantit que nodemon peut arrêter proprement le processus de nœud surveillé.
  • Ajoutez éventuellement le --uid paramètre, en ajoutant un nom unique pour votre processus. Dans l'exemple, l'uid est défini sur foo.

bash forever start --uid foo --killSignal=SIGTERM -c nodemon --exitcrash server.js

Pour tester cela, vous pouvez tuer le processus server.js et le redémarrer pour toujours. Si vous touch server.js nodemon le redémarrera.

Pour arrêter le processus surveillé par forever et nodemon, il suffit d'appeler ce qui suit, en utilisant le uid que nous avons attribué ci-dessus (foo):

bash forever stop foo

Cela arrêtera à la fois nodemon et le processus de noeud qu'il surveillait.

Notez que je ne recommanderais pas d'utiliser nodemon dans un environnement de production - mais c'est parce que je ne voudrais pas qu'il redémarre sans mes instructions explicites.

14
mik01aj

Je n'ai pas trouvé de moyen de faire fonctionner les deux packages ensemble. J'ai essayé de faire la technique de @ toxa, mais lorsque mon application node.js lançait un nodemon d'exception, il ne le redémarrait pas automatiquement, produisant à la place un message d'erreur dans le journal permanent:

nodemon] app crashed - waiting for file changes before starting...

Cependant, a toujours un -w option et la commande suivante est en fait la même chose que si j'exécute nodemon et pour toujours ensemble:

forever start -w my-app.js

L'inconvénient de forever -w versus nodemon: forever n'a pas d'option --delay, donc mon serveur est redémarré une fois pour chaque fichier modifié.

10
cfogelberg

Je préfère un combo de ce que Toxa et Jubair suggèrent.

forever start -c nodemon app.coffee --exitcrash
5
bcbrian

Si vous devez passer des arguments:

forever start -c "nodemon --harmony" app.js --exitcrash
2
Karl Morrison

J'utilise forever-service . . .

C'est ce qui a fonctionné pour moi. Il fait ce qui suit: chaque fois qu'un fichier json ou raml dans le dossier applications dist/assets est modifié, attendez 10 secondes, puis redémarrez l'application de nœud (script server.js):

$ forever-service install raml --script server.js -f " -c nodemon" -o " --delay 10 --watch dist/assets -e json,raml --exitcrash" -e "PATH=/usr/local/bin:$PATH"

Ensuite, je peux exécuter:

$ service raml start|stop|restart|status

Je peux également faire démarrer le service au redémarrage du serveur avec l'utilitaire chkconfig:

$ chkconfig --add raml
$ chkconfig raml on
1
Julia Anne Jacobs