Étant donné que ce message a attiré beaucoup d'attention au fil des ans, j'ai répertorié les meilleures solutions par plate-forme au bas de ce message.
Message d'origine :
Je veux que mon serveur node.js s'exécute en arrière-plan, c'est-à-dire: lorsque je ferme mon terminal, je veux que mon serveur continue de fonctionner. J'ai googlé cela et j'ai trouvé ce tutoriel , mais cela ne fonctionne pas comme prévu. Donc, au lieu d'utiliser ce script démon, je pensais que j'utilisais juste la redirection de sortie (la 2>&1 >> file
partie), mais cela aussi ne se termine pas - j'obtiens une ligne vierge dans mon terminal, comme s'il attendait des sorties / erreurs.
J'ai également essayé de mettre le processus en arrière-plan, mais dès que je ferme mon terminal, le processus est également tué.
Alors, comment puis-je le laisser fonctionner lorsque j'arrête mon ordinateur local?
Meilleures solutions :
- Systemd (Linux)
- Launchd (Mac)
- noeuds-fenêtres (Windows)
- PM2 (Node.js)
Réponses:
Copie de ma propre réponse à partir de Comment exécuter une application Node.js comme son propre processus?
Réponse 2015 : presque chaque distribution Linux est livrée avec systemd, ce qui signifie que pour toujours, monit, PM2, etc. ne sont plus nécessaires - votre système d'exploitation gère déjà ces tâches .
Créez un
myapp.service
fichier (en remplaçant 'myapp' par le nom de votre application, évidemment):Notez que si vous êtes nouveau sur Unix:
/var/www/myapp/app.js
devrait avoir#!/usr/bin/env node
sur la toute première ligne.Copiez votre fichier de service dans le
/etc/systemd/system
.Commencez avec
systemctl start myapp
.Activez-le pour démarrer au démarrage avec
systemctl enable myapp
.Voir les journaux avec
journalctl -u myapp
Ceci est extrait de Comment nous déployons des applications de nœuds sur Linux, édition 2018 , qui comprend également des commandes pour générer un AWS / DigitalOcean / Azure CloudConfig pour construire des serveurs Linux / nœuds (y compris le
.service
fichier).la source
~/.config/systemd/user
, le démarrer avecsystemctl --user start myapp
, l'activer avecsystemctl --user enable myapp
.Vous pouvez utiliser Forever, un simple outil CLI pour vous assurer qu'un script de nœud donné s'exécute en continu (c'est-à-dire pour toujours): https://www.npmjs.org/package/forever
la source
forever start /path/to/yourApp.js
dans votre script de démarrage du serveur.MISE À JOUR - Comme mentionné dans l'une des réponses ci-dessous, PM2 a de très belles fonctionnalités manquantes pour toujours. Pensez à l'utiliser.
Réponse originale
Utilisez nohup :
EDIT Je voulais ajouter que la réponse acceptée est vraiment la voie à suivre. J'utilise pour toujours les instances qui doivent rester actives. J'aime le faire
npm install -g forever
, c'est dans le chemin du nœud, puis juste faireforever start server.js
la source
nohup
représenteno hangup
ce qui vient de l'ancien temps, où vous vouliez garder un processus en vie lorsque vous "raccrochez" votre modem.Ce n'est peut-être pas la manière acceptée, mais je le fais avec l'écran, surtout pendant le développement car je peux le faire remonter et le tromper si nécessaire.
L'écran se détachera et survivra à votre déconnexion. Ensuite, vous pouvez le récupérer en faisant screen -r. Appuyez sur le manuel de l'écran pour plus de détails. Vous pouvez nommer les écrans et ainsi de suite si vous le souhaitez.
la source
Mise à jour 2016: la série node-windows / mac / linux utilise une API commune à tous les systèmes d'exploitation, c'est donc absolument une solution pertinente. Toutefois; node-linux génère des fichiers d'initialisation systemv. Alors que systemd continue de gagner en popularité, c'est en réalité une meilleure option sous Linux. Bienvenue aux RP si quelqu'un veut ajouter le support de systemd à node-linux :-)
Fil d'origine:
C'est un fil assez ancien maintenant, mais les fenêtres de noeud fournissent une autre façon de créer des services d'arrière-plan sur Windows. Il est vaguement basé sur le
nssm
concept d'utilisation d'unexe
wrapper autour de votre script de nœud. Toutefois; il utilise à lawinsw.exe
place et fournit un wrapper de nœud configurable pour un contrôle plus granulaire sur la façon dont le processus démarre / s'arrête en cas d'échec. Ces processus sont disponibles comme tout autre service:Le module cuit également dans certains journaux d'événements:
La démonétisation de votre script se fait via du code. Par exemple:
Le module prend en charge des choses comme le plafonnement des redémarrages (afin que les mauvais scripts ne gâchent pas votre serveur) et l'augmentation des intervalles de temps entre les redémarrages.
Étant donné que les services node-windows fonctionnent comme les autres, il est possible de gérer / surveiller le service avec n'importe quel logiciel que vous utilisez déjà.
Enfin, il n'y a pas de
make
dépendances. En d'autres termes, une simplenpm install -g node-windows
fonctionnera. Vous n'avez pas besoin de la magie de Visual Studio, .NET ou node-gyp pour l'installer. En outre, il est sous licence MIT et BSD.En toute divulgation, je suis l'auteur de ce module. Il a été conçu pour soulager la douleur exacte éprouvée par l'OP, mais avec une intégration plus étroite dans les fonctionnalités déjà fournies par le système d'exploitation. J'espère que les futurs téléspectateurs avec cette même question le trouveront utile.
la source
MISE À JOUR : j'ai mis à jour pour inclure la dernière de pm2:
pour de nombreux cas d'utilisation, l'utilisation d'un service systemd est la manière la plus simple et la plus appropriée de gérer un processus de nœud. pour ceux qui exécutent de nombreux processus de nœuds ou des microservices de nœuds fonctionnant indépendamment dans un seul environnement, pm2 est un outil plus complet.
https://github.com/unitech/pm2
http://pm2.io
pm2 monit
ou liste de processus avecpm2 list
pm2 logs
la source
Si vous voulez simplement exécuter le script sans interruption jusqu'à ce qu'il se termine, vous pouvez utiliser
nohup
comme déjà mentionné dans les réponses ici. Cependant, aucune des réponses ne fournit une commande complète qui enregistre égalementstdin
etstdout
.>>
moyens s'ajoutent àapp.log
.2>&1
s'assure que les erreurs sont également envoyéesstdout
et ajoutées au fichierapp.log
.&
garantit que votre terminal actuel est déconnecté de la commande afin que vous puissiez continuer à travailler.Si vous souhaitez exécuter un serveur de noeud (ou quelque chose qui devrait redémarrer au redémarrage du serveur), vous devez utiliser systemd / systemctl .
la source
Si vous exécutez OSX, le moyen le plus simple de produire un véritable processus système consiste
launchd
à le lancer.Construisez un plist comme celui-ci et placez-le dans / Library / LaunchDaemons avec le nom
top-level-domain.your-domain.application.plist
(vous devez être root lorsque vous le placez):Une fois terminé, lancez ceci (en tant que root):
et vous courez.
Et vous serez toujours en cours d'exécution après un redémarrage.
Pour d'autres options dans le plist, regardez la page de manuel ici: https://developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/man5/launchd.plist.5.html
la source
Essayez d'exécuter cette commande si vous utilisez nohup -
Vous pouvez également utiliser éternellement pour démarrer le serveur
PM2 prend également en charge
npm start
la source
pm2 start npm -- start
J'utilise simplement le module daemon npm:
Dernièrement, j'utilise également mon (1) de TJ Holowaychuk pour démarrer et gérer des applications de nœud simples.
la source
J'utilise Supervisor pour le développement. Ça marche juste. Chaque fois que vous apportez des modifications à un fichier .js, Supervisor redémarre automatiquement votre application avec ces modifications chargées.
Voici un lien vers sa page Github
Installer:
Vous pouvez facilement lui faire regarder d'autres extensions avec -e. Une autre commande que j'utilise souvent est -i pour ignorer certains dossiers.
Vous pouvez utiliser nohup et superviseur pour faire fonctionner votre application de nœud en arrière-plan même après votre déconnexion.
la source
Node.js en tant que service d'arrière-plan dans WINDOWS XP
Installation:
Créez c: \ node \ helloworld.js
Ouvrez la console de commande et tapez ce qui suit (setx uniquement si le Kit de ressources est installé)
Un bon cadeau par lots est de créer c: \ node \ ServiceMe.cmd
La gestion des services:
la source
La réponse acceptée est probablement la meilleure réponse de production, mais pour un hack rapide faisant du travail de développement, j'ai trouvé ceci:
nodejs scriptname.js &
n'a pas fonctionné, car nodejs semblait engloutir le &, et donc la chose ne m'a pas permis de continuer à utiliser le terminal sans que scriptname.js ne meure.Mais j'ai mis
nodejs scriptname.js
un fichier .sh et j'ainohup sh startscriptname.sh &
travaillé.Ce n'est certainement pas un problème de production, mais cela résout le problème "J'ai besoin de continuer à utiliser mon terminal et je ne veux pas démarrer 5 terminaux différents".
la source
Si vous exécutez nodejs sur un serveur Linux, je pense que c'est la meilleure façon.
Créez un script de service et copiez-le dans /etc/init/nodejs.conf
démarrer le service: sudo service nodejs start
arrêter le service: sudo service nodejs stop
Script Sevice
la source
Mise à jour de juin 2017:
Solution pour Linux: (chapeau rouge). Les commentaires précédents ne fonctionnent pas pour moi. Cela fonctionne pour moi sur Amazon Web Service - Red Hat 7. J'espère que cela fonctionne pour quelqu'un là-bas.
la source
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 8080
ce qu'il fait. Pouvez-vous me donner plus de détails s'il vous plaît. Je ne suis pas sûr mais je pense qu'il redirige le trafic80
vers8080
quel serveur de noeud écoute, non?utilisez nssm la meilleure solution pour windows, téléchargez simplement nssm , ouvrez cmd dans le répertoire nssm et tapez
cela installera un nouveau service Windows qui sera répertorié sur services.msc à partir de là, vous pouvez démarrer ou arrêter le service, ce service démarrera automatiquement et vous pouvez configurer pour redémarrer s'il échoue.
la source
Pour compléter les différentes options suggérées, voici une autre: la
daemon
commande dans GNU / Linux, que vous pouvez lire ici: http://libslack.org/daemon/manpages/daemon.1.html . (excuses si cela est déjà mentionné dans l'un des commentaires ci-dessus).la source
Découvrez fugue! En plus de lancer de nombreux travailleurs, vous pouvez également diaboliser votre processus de nœud!
http://github.com/pgte/fugue
la source
quelqu'un a-t-il remarqué une erreur insignifiante sur la position "2> & 1"?
devrait être
la source
J'utilise tmux pour un environnement de développement à fenêtres / volets multiples sur des hôtes distants. Il est très simple de détacher et de maintenir le processus en arrière-plan. Jetez un œil à tmux
la source
Pour les personnes utilisant des versions plus récentes du module démon npm - vous devez passer des descripteurs de fichiers au lieu de chaînes:
la source
PM2 est un gestionnaire de processus de production pour les applications Node.js avec un équilibreur de charge intégré. Il vous permet de maintenir les applications en vie pour toujours, de les recharger sans interruption et de faciliter les tâches d'administration système courantes. https://github.com/Unitech/pm2
la source
Je suis surpris que personne n'ait mentionné Guvnor
Je l' ai essayé pour toujours, PM2, etc. Mais, en matière de contrôle solide et des mesures de performance basées sur le Web, j'ai trouvé Guvnor de loin le meilleur. De plus, il est également entièrement open source.
Edit: Cependant, je ne sais pas si cela fonctionne sur Windows. Je ne l'ai utilisé que sur Linux.
la source
Comme il me manque cette option dans la liste des réponses fournies, j'aimerais ajouter une option éligible à partir de 2020: docker ou tout conteneur équivalent plate forme de . En plus de garantir que votre application fonctionne dans un environnement stable, il y a des avantages de sécurité supplémentaires ainsi qu'une portabilité améliorée.
Il existe un support Docker pour Windows, macOS et la plupart des distributions Linux majeures. L'installation de Docker sur une plate - forme prise en charge est assez simple et bien documentée. La configuration d'une application Node.js est aussi simple que de la placer dans un conteneur et d'exécuter ce conteneur tout en s'assurant qu'elle est redémarrée après l'arrêt.
Créer une image de conteneur
En supposant que votre application est disponible dans / home / me / my-app sur ce serveur, créez un fichier texte Dockerfile dans le dossier / home / me / my-app avec un contenu similaire à celui-ci:
Créez l'image en utilisant une commande comme celle-ci:
Remarque: dernier paramètre consiste à sélectionner le dossier contenant ce Dockerfile au lieu du Dockerfile lui-même. Vous pouvez en choisir un autre en utilisant l'option -f .
Démarrer le conteneur
Utilisez cette commande pour démarrer le conteneur:
Cette commande suppose que votre application écoute sur le port 3000 et que vous souhaitez qu'elle soit exposée sur le port 80 de votre hôte.
C'est un exemple très limité à coup sûr, mais c'est un bon point de départ.
la source
Si vous utilisez pm2, vous pouvez l'utiliser avec la valeur
autorestart
setfalse
:Cela va générer un échantillon
ecosystem.config.js
:la source
Cette réponse est assez tardive pour le groupe, mais j'ai trouvé que la meilleure solution était d'écrire un script shell qui utilisait à la fois les commandes
screen -dmS
etnohup
.J'ajoute également le
>> logfile
bit à la fin pour pouvoir facilement enregistrer lesconsole.log()
instructions de noeud .Pourquoi ai-je utilisé un script shell? Eh bien, j'ai également ajouté une instruction if qui vérifiait si le
node myserver.js
processus était déjà en cours d'exécution.De cette façon, j'ai pu créer une seule option de ligne de commande qui me permet à la fois de maintenir le serveur en marche et de le redémarrer lorsque j'ai apporté des modifications, ce qui est très utile pour le développement.
la source