Comment faire fonctionner un noeud.js application comme un service d'arrière-plan?

depuis ce post a reçu beaucoup d'attention au fil des ans, j'ai énuméré les meilleures solutions par plate-forme au bas de ce post.


Original post :

je veux mon noeud.js server à exécuter en arrière-plan, c'est-à-dire: quand je ferme mon terminal, je veux que mon serveur continue de fonctionner. J'ai googlé cela et est venu avec ce tutoriel , mais il ne fonctionne pas comme destiné. Donc au lieu d'utiliser ce script de démon, j'ai pensé que j'utilisais juste la redirection de sortie (la partie 2>&1 >> file ), mais cela aussi ne sort pas - j'ai une ligne vide dans mon terminal, comme si elle attendait la sortie/les erreurs.

j'ai aussi essayé de mettre le processus en arrière-plan, mais dès que je ferme mon terminal le processus est tué ainsi.

alors comment puis-je le laisser fonctionner quand j'éteins mon ordinateur local?


meilleures solutions :

  • Systemd (Linux)
  • Launchd (Mac)
  • node-windows (Windows)
  • PM2 (Node.js)
377
demandé sur mikemaccana 2010-10-25 23:34:10

24 réponses

copier ma propre réponse de comment exécuter un noeud.l'application js comme son propre processus?

réponse 2015 : presque chaque distribution Linux est livrée avec systemd, ce qui signifie forever, monit, etc ne sont plus nécessaires - votre OS gère déjà ces tâches .

créer un fichier myapp.service (remplacer "myapp" par le nom de votre application, évidemment):

[Unit]
Description=My app

[Service]
ExecStart=/var/www/myapp/app.js
Restart=always
User=nobody
# Note Debian/Ubuntu uses 'nogroup', RHEL/Fedora uses 'nobody'
Group=nogroup
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
WorkingDirectory=/var/www/myapp

[Install]
WantedBy=multi-user.target

Note 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 .

commence par systemctl start myapp .

permet de démarrer avec systemctl enable myapp .

voir grumes avec journalctl -u myapp

Ceci est tiré de comment nous déployons les applications node sur Linux, édition 2018 , qui comprend également des commandes pour générer un CloudConfig AWS/DigitalOcean/Azur pour construire des serveurs Linux/node (y compris le fichier .service ).

293
répondu mikemaccana 2018-08-12 16:09:37

vous pouvez utiliser pour toujours, un outil CLI simple pour s'assurer qu'un script de noeud donné fonctionne en continu (c.-à-d. pour toujours): https://www.npmjs.org/package/forever

231
répondu muzz 2014-05-21 17:26:53

UPDATE - comme mentionné dans l'une des réponses ci-dessous, PM2 a une fonctionnalité vraiment agréable manquant à jamais. Envisagez de l'utiliser.

Réponse Originale À Cette Question

Use nohup :

nohup node server.js &

EDIT je voulais ajouter que la réponse acceptée est vraiment la voie à suivre. J'utilise pour toujours les instances qui doivent rester éveillées. J'aime faire npm install -g forever il est dans le chemin d'accès du nœud et puis il suffit de faire forever start server.js

191
répondu NG. 2015-07-17 11:19:19

ce n'est peut-être pas la façon acceptée, mais je le fais avec l'écran, surtout pendant le développement parce que je peux le ramener et tromper avec elle si nécessaire.

screen
node myserver.js
>>CTRL-A then hit D

l'écran se détachera et vous survivra en vous déconnectant. Ensuite, tu pourras le récupérer en faisant screen-R. Cliquez sur le manuel de l'écran pour plus de détails. Vous pouvez nommer les écrans et autres joyeusetés si vous le souhaitez.

57
répondu UltimateBrent 2010-10-25 19:42:57

2016 Mise à jour: La série node-windows/mac/linux utilise une API commune à tous les systèmes d'exploitation, c'est donc une solution absolument pertinente. Cependant, node-linux génère des fichiers d'initialisation systemv. Comme systemd continue de croître en popularité, il est réaliste une meilleure option sur Linux. PR est la bienvenue si quelqu'un veut ajouter systemd soutien à nœud-linux :-)

Fil D'Origine:

C'est un assez vieux fil maintenant, mais node-windows fournit une autre façon de créer des services d'arrière-plan sur Windows. Il est vaguement basé sur le concept nssm d'utiliser un enveloppeur exe autour de votre script de noeud. Cependant, il utilise winsw.exe à la place et fournit un enveloppeur de noeuds configurable pour un contrôle plus granulaire sur la façon dont le processus commence/s'arrête sur les échecs. Ces processus sont disponibles comme tout autre service:

enter image description here

le module se transforme aussi en journalisation d'événements:

enter image description here

la démonisation de votre script s'effectue par code. Par exemple:

var Service = require('node-windows').Service;

// Create a new service object
var svc = new Service({
  name:'Hello World',
  description: 'The nodejs.org example web server.',
  script: 'C:\path\to\my\node\script.js'
});

// Listen for the "install" event, which indicates the
// process is available as a service.
svc.on('install',function(){
  svc.start();
});

// Listen for the "start" event and let us know when the
// process has actually started working.
svc.on('start',function(){
  console.log(svc.name+' started!\nVisit http://127.0.0.1:3000 to see it in action.');
});

// Install the script as a service.
svc.install();

le module prend en charge des choses comme la fermeture des redémarrages (donc les mauvais scripts ne dévient pas votre serveur) et les intervalles de temps croissants entre les redémarrages.

depuis que les services node-windows fonctionnent comme n'importe quel autre, il est possibilité de gérer/surveiller le service avec n'importe quel logiciel que vous utilisez déjà.

enfin, il n'y a pas de dépendances make . En d'autres termes, un simple npm install -g node-windows fonctionnera. Vous n'avez pas besoin de Visual Studio, .NET ou de node-gyp magic pour l'installer. Aussi, il est MIT et BSD sous licence.

en pleine divulgation, je suis l'auteur de ce module. Il a été conçu pour soulager la douleur exacte que l'opération a connu, mais avec une intégration plus étroite dans le fonctionnalité déjà fournie par le système D'exploitation. J'espère que les futurs téléspectateurs avec cette même question la trouveront utile.

55
répondu Corey 2016-08-12 16:49:04

mise à jour : j'ai mis à jour pour inclure le plus récent 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 noeud. pour ceux qui exécutent de nombreux processus de noeud ou des microservices de noeud de façon indépendante dans un environnement unique, pm2 est un outil plus complet.

https://github.com/unitech/pm2

http://pm2.io

  • il a une fonction de surveillance vraiment utile - > jolie 'gui' pour la surveillance en ligne de commande de plusieurs processus avec pm2 monit ou liste de processus avec pm2 list
  • organisé gestion des Journaux -> pm2 logs
  • autres choses:
    • Comportement de configuration
    • carte Source de soutien
    • PaaS Compatible
    • Watch & Reload
    • "1519180920 Module" Système
    • mémoire Max recharger
    • Mode Cluster
    • à Chaud " recharger
    • flux de développement
    • Scripts De Démarrage
    • saisie semi-Automatique
    • workflow de déploiement
    • Keymetrics de surveillance
    • API
25
répondu Hutch 2016-10-16 16:24:11

si vous utilisez OSX, alors la façon la plus simple de produire un vrai processus système est d'utiliser launchd pour le lancer.

construisez un plist comme celui-ci, et mettez-le dans le /Library/LaunchDaemons avec le nom top-level-domain.your-domain.application.plist (vous devez être root en le plaçant):

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>top-level-domain.your-domain.application</string>

    <key>WorkingDirectory</key>
    <string>/your/preferred/workingdirectory</string>

    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/bin/node</string>
        <string>your-script-file</string>
    </array>

    <key>RunAtLoad</key>
    <true/>

    <key>KeepAlive</key>
    <true/>

</dict>
</plist>

une fois fait, délivrer ceci (en tant que racine):

launchctl load /Library/LaunchDaemons/top-level-domain.your-domain.application.plist
launchctl start top-level-domain.your-domain.application

et vous courez.

et vous courrez toujours après un redémarrer.

pour les 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

16
répondu Lars Christensen 2014-09-23 15:07:34

je suis simplement à l'aide de la démon npm module:

var daemon = require('daemon');

daemon.daemonize({
    stdout: './log.log'
  , stderr: './log.error.log'
  }
, './node.pid'
, function (err, pid) {
  if (err) {
    console.log('Error starting daemon: \n', err);
    return process.exit(-1);
  }
  console.log('Daemonized successfully with pid: ' + pid);

  // Your Application Code goes here
});

dernièrement j'utilise aussi lun(1) de TJ Holowaychuk pour démarrer et gérer des applications de noeuds simples.

13
répondu LoG 2012-07-24 14:21:00

J'utilise le superviseur pour le développement. Il fonctionne, tout simplement. Lorsque vous apportez des modifications à un .fichier js Superviseur redémarre automatiquement votre application avec ces changements chargé.

voici un lien vers sa page Github

Installation :

sudo npm install supervisor-g

vous pouvez facilement le faire regarder d'autres extensions avec-E. Une autre commande que j'utilise souvent est -je à ignorer certains dossiers.

vous pouvez utiliser nohup et le superviseur pour faire tourner votre application de noeud en arrière-plan même après que vous vous êtes déconnecté.

sudo nohup superviseur myapp.js &

12
répondu Donald Gary 2013-10-05 16:22:18

si vous voulez simplement exécuter le script sans interruption jusqu'à ce qu'il soit terminé, vous pouvez utiliser nohop comme déjà mentionné dans les réponses ici. Cependant, aucune des réponses ne fournit une commande complète qui enregistre aussi stdin et stdout .

nohup node index.js >> app.log 2>&1 &
  • Le >> signifie ajouter à app.log .
  • 2>&1 s'assure que les erreurs sont également envoyées à stdout et ajoutées au app.log .
  • la fin & assure que votre terminal actuel est déconnecté de la commande afin que vous puissiez continuer à travailler.

si vous voulez exécuter un serveur de noeuds (ou quelque chose qui devrait démarrer à nouveau lorsque le serveur redémarre), vous devez utiliser systemd / systemctl .

10
répondu Xeoncross 2017-10-13 15:05:26

Node.js comme un service d'arrière-plan dans WINDOWS XP

Installation:

  1. Install WGET http://gnuwin32.sourceforge.net/packages/wget.htm via l'exécutable de l'installateur
  2. Install GIT http://code.google.com/p/msysgit/downloads/list via l'exécutable de l'installateur
  3. installer NSSM http://nssm.cc/download/?page=download via copying nnsm.exe dans le dossier % windir% / System 32
  4. créer c:\node\helloworld.js

    // http://howtonode.org/hello-node
    var http = require('http');
    var server = http.createServer(function (request, response) {
        response.writeHead(200, {"Content-Type": "text/plain"});
        response.end("Hello World\n");
    });
    server.listen(8000);
    console.log("Server running at http://127.0.0.1:8000/");
    
  5. Ouvrir la console de commande et tapez la commande suivante (setx uniquement si le Kit de Ressources est installé)

    C:\node> set path=%PATH%;%CD%
    C:\node> setx path "%PATH%"
    C:\node> set NODE_PATH="C:\Program Files\nodejs\node_modules"
    C:\node> git config --system http.sslcainfo /bin/curl-ca-bundle.crt    
    C:\node> git clone --recursive git://github.com/isaacs/npm.git    
    C:\node> cd npm    
    C:\node\npm> node cli.js install npm -gf   
    C:\node> cd ..    
    C:\node> nssm.exe install node-helloworld "C:\Program Files\nodejs\node.exe" c:\node\helloworld.js    
    C:\node> net start node-helloworld
    
  6. un petit lot de goodie est de créer c:\node\ServiceMe.cmd

    @echo off
    nssm.exe install node-%~n1 "C:\Program Files\nodejs\node.exe" %~s1
    net start node-%~n1
    pause
    

Gestion Des Services:

  • les services eux-mêmes sont maintenant accessibles via Démarrer-> Exécuter-> service.msc ou via Démarrer->Exécuter-> MSCONFIG-> Services (et cocher " Masquer Tous Les Services Microsoft").
  • le script préfixe chaque noeud réalisé via le script batch avec 'nœud'.
  • de même, ils peuvent être trouvés dans le registre: " HKLM\SYSTEM\CurrentControlSet\Services\node-xxxx
7
répondu Page2PagePro 2012-10-18 21:44:51

la réponse acceptée est probablement la meilleure réponse de production, mais pour un hack rapide faisant le travail de dev, j'ai trouvé ceci:

nodejs scriptname.js & n'a pas fonctionné, parce que nodejs semblait engloutir le &, et donc la chose ne m'a pas permis de continuer à utiliser le terminal sans scriptname.js en train de mourir.

mais j'ai mis nodejs scriptname.js dans un .fichier sh, et nohup sh startscriptname.sh & travaillé.

certainement pas une chose de production, mais il résout le "je dois continuer à utiliser mon terminal et ne veulent pas commencer 5 terminaux différents " problème.

6
répondu ArtHare 2016-04-22 14:28:28

si vous utilisez nodejs dans linux server, je pense que c'est la meilleure façon.

créer un script de service et copier dans /etc/init / nodejs.conf

démarrer le service: sudo service de nodejs démarrer

arrêter le service: sudo service de nodejs stop

Sevice script

description "DManager node.js server - Last Update: 2012-08-06"
author      "Pedro Muniz - pedro.muniz@geeklab.com.br"

env USER="nodejs" #you have to create this user 
env APPNAME="nodejs" #you can change the service name
env WORKDIR="/home/<project-home-dir>" #set your project home folder here
env COMMAND="/usr/bin/node <server name>" #app.js ?

# used to be: start on startup
# until we found some mounts weren't ready yet while booting:
start on started mountall
stop on shutdown

# Automatically Respawn:
respawn
respawn limit 99 5

pre-start script
    sudo -u $USER echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Starting" >> /var/log/$APPNAME.log
end script

script
    # Not sure why $HOME is needed, but we found that it is:
    export HOME="<project-home-dir>"  #set your project home folder here
    export NODE_PATH="<project node_path>"

    #log file, grant permission to nodejs user
    exec start-stop-daemon --start --make-pidfile --pidfile /var/run/$APPNAME.pid --chuid $USER --chdir $WORKDIR --exec $COMMAND >> /var/log/$APPNAME.log 2>&1
end script

post-start script
   # Optionally put a script here that will notifiy you node has (re)started
   # /root/bin/hoptoad.sh "node.js has started!"
end script

pre-stop script
    sudo -u $USER echo "[`date -u +%Y-%m-%dT%T.%3NZ`] (sys) Stopping" >> /var/log/$APPNAME.log
end script
4
répondu Pedro Muniz 2014-09-03 12:46:42

Essayez d'exécuter cette commande si vous utilisez nohup -

nohup npm start 2>/dev/null 1>/dev/null&

vous pouvez également utiliser pour toujours pour démarrer le serveur

forever start -c "npm start" ./ 
4
répondu Himanshu Teotia 2017-03-31 07:31:56

utiliser nssm la meilleure solution pour windows, il suffit de télécharger nssm , ouvrir cmd pour nssm répertoire et tapez

nssm install <service name> <node path> <app.js path> 

eg: nssm install myservice "C:\Program Files\nodejs" "C:\myapp\app.js" 

cela installera un nouveau service windows qui sera listé aux services .msc à partir de là, vous pouvez démarrer ou arrêter le service, ce service démarre automatiquement et vous pouvez configurer pour redémarrer si elle échoue.

3
répondu Aun Rizvi 2014-03-21 12:20:03

pour compléter les différentes options suggérées, en voici une autre: la commande daemon dans GNU / Linux, que vous pouvez lire ici: http://libslack.org/daemon/manpages/daemon.1.html . (veuillez vous excuser si cela est déjà mentionné dans l'un des commentaires ci-dessus).

2
répondu ravi 2013-06-04 04:16:08

Juin 2017 Mise À Jour:

Solution pour Linux (Red hat). Les commentaires précédents ne fonctionnent pas pour moi. Cela fonctionne pour moi sur Amazon Web Service - Red Hat 7. Espérons que cela fonctionne pour quelqu'un là-bas.

A. Create the service file 
sudo vi /etc/systemd/system/myapp.service
[Unit]
Description=Your app
After=network.target

[Service]
ExecStart=/home/ec2-user/meantodos/start.sh
WorkingDirectory=/home/ec2-user/meantodos/

[Install]
WantedBy=multi-user.target

B. Create a shell file
/home/ec2-root/meantodos/start.sh
#!/bin/sh -
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 8080
npm start

then:
chmod +rx /home/ec2-root/meantodos/start.sh
(to make this file executable)

C. Execute the Following

sudo systemctl daemon-reload
sudo systemctl start myapp
sudo systemctl status myapp

(If there are no errors, execute below.  Autorun after server restarted.)
chkconfig myapp -add
2
répondu Eman Jayme 2017-06-27 10:40:30

regardez fugue! En plus de lancer de nombreux travailleurs, vous pouvez diaboliser votre processus de noeud aussi!

http://github.com/pgte/fugue

1
répondu Shripad Krishna 2010-10-26 05:10:05

quelqu'un a-t-il remarqué une légère erreur dans la position de" 2>&1"?

2>&1 >> file

devrait être

>> file 2>&1
1
répondu osexp2003 2016-02-20 13:49:56

j'utilise tmux pour un environnement de développement de fenêtres/fenêtres multiples sur des hôtes distants. Il est très simple de se détacher et de garder le processus en marche à l'arrière-plan. Jetez un oeil à tmux

1
répondu Karl Pokus 2017-03-07 08:52:17

cette réponse est assez tardive pour le parti, mais j'ai trouvé que la meilleure solution était d'écrire un script shell qui utilisait à la fois les commandes screen -dmS et nohup .

screen -dmS newScreenName nohup node myserver.js >> logfile.log

j'ajoute aussi le bit >> logfile à la fin pour pouvoir enregistrer facilement les instructions console.log() .

Pourquoi ai-je utilisé un script shell? J'ai aussi ajouté une instruction if qui vérifiait si le processus node myserver.js était déjà en cours.

de cette façon, j'ai pu créer une option en ligne de commande unique qui me permet à la fois de garder le serveur en marche et de le redémarrer lorsque j'ai fait des changements, ce qui est très utile pour le développement.

0
répondu Anwar Hahj Jefferson-George 2012-04-19 15:00:29

PM2 est un gestionnaire de processus de production pour Node.js applications avec un équilibreur de charge. Il vous permet de garder les applications en vie pour toujours, de les recharger sans temps d'arrêt et de faciliter les tâches communes d'administration du système. https://github.com/Unitech/pm2

0
répondu Arezki Lebdiri 2015-10-09 19:15:45

je suis surpris que personne n'ait mentionné Guvnor

j'ai essayé pour toujours, pm2, etc. Mais, en ce qui concerne le contrôle solide et les paramètres de performance basés sur le web, j'ai trouvé que Guvnor est de loin le meilleur. De plus, il est également entièrement opensource.

enter image description here

Edit : Cependant, je ne suis pas sûr si cela fonctionne sur windows. Je ne l'ai utilisé que sous linux.

0
répondu Josh 2015-10-24 15:23:24

C'est très simple.

  1. ajouter le paquet.json dans votre projet
  2. ajouter le nom ou le chemin du fichier script dans votre paquet.JSON Start
  3. ensuite simple allez sur votre console ouvrez votre répertoire de projet par chemin de cd / vers / répertoire /
  4. Écrire nohup mnp démarrer

ci-après est un colis .JSON échantillon que tout le monde peut utiliser. { "nom": "Projet",

  "version": "1.0.0",

  "main": "httpsserver.js",

  "scripts": {

    "start": "node httpsserver.js"
  },

  "keywords": [],

  "author": "",

  "license": "ISC",

  "dependencies": {},

  "devDependencies": {},

  "description": ""

}
-1
répondu Mishi 2017-05-17 11:01:18