servidor servicio run produccion node levantar framework ejecutar como aplicacion node.js process background server daemon

node.js - servicio - node js run forever



¿Cómo ejecuto una aplicación node.js como un servicio en segundo plano? (25)

Dado que esta publicación ha recibido mucha atención a lo largo de los años, he incluido las mejores soluciones por plataforma al final de esta publicación.

Publicación original :

Quiero que mi servidor node.js se ejecute en segundo plano, es decir, cuando cierre mi terminal quiero que mi servidor siga funcionando. He buscado en Google y se me ocurrió este tutorial , sin embargo, no funciona como estaba previsto. Entonces, en lugar de usar esa secuencia de comandos de daemon, pensé que solo usé la redirección de salida (la parte del 2>&1 >> file ), pero esto tampoco se cierra. Tengo una línea en blanco en mi terminal, como si estuviera esperando una salida / error. .

También intenté poner el proceso en segundo plano, pero tan pronto como cierre mi terminal, el proceso también se detiene.

Entonces, ¿cómo puedo dejarlo funcionando cuando apago mi computadora local?

Mejores soluciones :

  • Systemd (Linux)
  • Launchd (Mac)
  • node-windows (Windows)
  • PM2 (Node.js)

¿Alguien ha notado un error trivial de la posición de "2> & 1"?

2>&1 >> file

debiera ser

>> file 2>&1


Actualización de junio de 2017:
Solución para Linux: (Red hat). Los comentarios anteriores no funcionan para mí. Esto me funciona en Amazon Web Service - Red Hat 7. Espero que esto funcione para alguien.

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


Copiando mi propia respuesta de ¿Cómo ejecuto una aplicación Node.js como su propio proceso?

Respuesta del 2015 : casi todas las distribuciones de Linux vienen con systemd, lo que significa que para siempre, ya no son necesarios monit, etc., su sistema operativo ya maneja estas tareas .

Cree un archivo myapp.service (reemplazando ''myapp'' con el nombre de su aplicación, obviamente):

[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

Tenga en cuenta si es nuevo en Unix: /var/www/myapp/app.js debería tener #!/usr/bin/env node en la primera línea.

Copie su archivo de servicio en el /etc/systemd/system .

systemctl start myapp con systemctl start myapp .

Permitir que se ejecute en el arranque con systemctl enable myapp .

Ver registros con journalctl -u myapp

Esto se ha tomado de Cómo implementamos las aplicaciones de nodo en Linux, edición 2018 , que también incluye comandos para generar un CloudConfig de AWS / DigitalOcean / Azure para construir servidores Linux / node (incluido el archivo de servicio).


Echa un vistazo a la fuga! Además de lanzar muchos trabajadores, ¡también puede demonizar el proceso de su nodo!

http://github.com/pgte/fugue


Es muy sencillo.

  1. Agrega package.json en tu proyecto
  2. Agregue el nombre del archivo de script o la ruta en su Package.JSON Start
  3. Luego simplemente vaya a su consola, abra el directorio de su proyecto por la ruta del CD / al directorio /
  4. Escribe nohup npm start

A continuación se muestra un ejemplo de Package.JSON que cualquiera puede usar. {"nombre": "Proyecto",

"version": "1.0.0", "main": "httpsserver.js", "scripts": { "start": "node httpsserver.js" }, "keywords": [], "author": "", "license": "ISC", "dependencies": {}, "devDependencies": {}, "description": "" }


Esta respuesta es bastante tarde para la fiesta, pero descubrí que la mejor solución era escribir un script de shell que usara los comandos screen -dmS y nohup .

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

También agrego el >> logfile bit de >> logfile registro al final para poder guardar fácilmente las declaraciones del nodo console.log() .

¿Por qué usé un script de shell? Bueno, también agregué una declaración if que verificó si el proceso node myserver.js del node myserver.js ya se estaba ejecutando.

De esa manera, pude crear una única opción de línea de comandos que me permite mantener el servidor en funcionamiento y también reiniciarlo cuando haya realizado cambios, lo cual es muy útil para el desarrollo.


Intente ejecutar este comando si está usando nohup -

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

También puede utilizar para siempre para iniciar el servidor

forever start -c "npm start" ./


La respuesta aceptada es probablemente la mejor respuesta de producción, pero para un hackeo rápido haciendo el trabajo de desarrollo, encontré esto:

nodejs scriptname.js & no funcionó, porque nodejs parecía engullir el &, por lo que la cosa no me permitió seguir usando el terminal sin scriptname.js morir.

Pero puse nodejs scriptname.js en un archivo .sh, y nohup sh startscriptname.sh & funcionó.

Definitivamente no es algo de producción, pero soluciona el problema "Necesito seguir usando mi terminal y no quiero iniciar 5 terminales diferentes".


Me sorprende que nadie haya mencionado a Guvnor

He intentado para siempre, pm2, etc. Pero, cuando se trata de un control sólido y métricas de rendimiento basadas en la web, encontré a Guvnor como el mejor. Además, también es completamente de código abierto.

Edit: Sin embargo, no estoy seguro de si funciona en Windows. Solo lo he usado en linux.


Node.js como servicio en segundo plano en WINDOWS XP

Instalación:

  1. Instale WGET http://gnuwin32.sourceforge.net/packages/wget.htm través del ejecutable del instalador
  2. Instale GIT http://code.google.com/p/msysgit/downloads/list través del ejecutable del instalador
  3. Instale NSSM http://nssm.cc/download/?page=download mediante la copia de nnsm.exe en la carpeta% windir% / system32
  4. Crear 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. Abra la consola de comandos y escriba lo siguiente (solo setx si el Kit de recursos está instalado)

    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 buen regalo por lotes es crear c: / node / ServiceMe.cmd

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

Gestión De Servicios:

  • Ahora se puede acceder a los servicios a través de Inicio-> Ejecutar-> services.msc o a través de Inicio-> Ejecutar-> MSCONFIG-> Servicios (y marque ''Ocultar todos los servicios de Microsoft'').
  • La secuencia de comandos prefijará cada nodo creado a través de la secuencia de comandos por lotes con ''nodo-''.
  • Del mismo modo, se pueden encontrar en el registro: " HKLM / SYSTEM / CurrentControlSet / Services / node-xxxx "

PM2 es un administrador de procesos de producción para aplicaciones Node.js con un equilibrador de carga incorporado. Le permite mantener las aplicaciones con vida para siempre, recargarlas sin tiempo de inactividad y facilitar las tareas comunes de administración del sistema. github.com/Unitech/pm2


Para las personas que utilizan versiones más nuevas del módulo npm del daemon , debe pasar descriptores de archivo en lugar de cadenas:

var fs = require(''fs''); var stdoutFd = fs.openSync(''output.log'', ''a''); var stderrFd = fs.openSync(''errors.log'', ''a''); require(''daemon'')({ stdout: stdoutFd, stderr: stderrFd });


Para redondear las diversas opciones sugeridas, aquí hay una más: el comando daemon en GNU / Linux, que puede leer aquí: http://libslack.org/daemon/manpages/daemon.1.html . (disculpas si esto ya se menciona en uno de los comentarios anteriores).


Puede que esta no sea la forma aceptada, pero lo hago con la pantalla, especialmente mientras estoy en desarrollo porque puedo recuperarlo y engañarlo si es necesario.

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

La pantalla se desprenderá y sobrevivirá al cerrar sesión. Entonces puedes recuperarlo haciendo pantalla -r. Pulse el manual de la pantalla para más detalles. Puedes nombrar las pantallas y otras cosas si quieres.


Puede usar Forever, una sencilla herramienta CLI para garantizar que un script de nodo determinado se ejecute continuamente (es decir, para siempre): https://www.npmjs.org/package/forever


Si está ejecutando OSX, la forma más fácil de producir un verdadero proceso de sistema es usar launchd para iniciarlo.

Cree una lista como esta y colóquela en / Library / LaunchDaemons con el nombre top-level-domain.your-domain.application.plist (debe ser root al colocarlo):

<?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>

Cuando haya terminado, emita esto (como root):

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

y tu estas corriendo

Y todavía estarás ejecutando después de un reinicio.

Para ver otras opciones en la página de manual, visite la página de manual https://developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/man5/launchd.plist.5.html


Si está ejecutando nodejs en un servidor linux, creo que esta es la mejor manera.

Cree un script de servicio y cópielo a /etc/init/nodejs.conf

iniciar servicio: sudo service nodejs start

detener el servicio: sudo service nodejs stop

Sevice script

description "DManager node.js server - Last Update: 2012-08-06" author "Pedro Muniz - [email protected]" 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


Si simplemente desea ejecutar el script sin interrupciones hasta que se complete, puede usar nohop como ya se mencionó en las respuestas aquí. Sin embargo, ninguna de las respuestas proporciona un comando completo que también registre stdin y stdout .

nohup node index.js >> app.log 2>&1 &

  • El >> significa adjuntar a app.log .
  • 2>&1 se asegura de que los errores también se envíen a la app.log y se agreguen al app.log .
  • El final & se asegura de que su terminal actual esté desconectado del comando para que pueda continuar trabajando.

Si desea ejecutar un servidor de nodo (o algo que debería iniciarse cuando se reinicia el servidor) debe usar systemd / systemctl .


Simplemente estoy usando el módulo daemon npm:

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 });

Últimamente, también estoy usando mon(1) de TJ Holowaychuk para iniciar y administrar aplicaciones de nodo simples.


Uso Supervisor para el desarrollo. Simplemente funciona. Cada vez que realice cambios en un archivo .js, Supervisor reinicia automáticamente su aplicación con esos cambios cargados.

Aquí hay un enlace a su página Github

Instalar:

sudo npm install supervisor -g

Puedes hacerlo fácilmente ver otras extensiones con -e. Otro comando que utilizo a menudo es -i para ignorar ciertas carpetas.

Puede usar nohup y supervisor para hacer que su aplicación de nodo se ejecute en segundo plano, incluso después de cerrar la sesión.

sudo nohup supervisor myapp.js &


Uso tmux para un entorno de desarrollo de múltiples ventanas / paneles en hosts remotos. Es realmente sencillo separar y mantener el proceso ejecutándose en segundo plano. Echa un vistazo a tmux


use nssm la mejor solución para Windows, solo descargue nssm , abra cmd en el directorio nssm y escriba

nssm install <service name> <node path> <app.js path> eg: nssm install myservice "C:/Program Files/nodejs" "C:/myapp/app.js"

esto instalará un nuevo servicio de Windows que se enumerará en services.msc desde allí, puede iniciar o detener el servicio, este servicio se iniciará automáticamente y se puede configurar para reiniciar si falla.


ACTUALIZACIÓN : actualicé para incluir lo último de pm2:

para muchos casos de uso, el uso de un servicio systemd es la forma más sencilla y apropiada de administrar un proceso de nodo. Para aquellos que ejecutan numerosos procesos de nodo o microservicios de nodo que se ejecutan de forma independiente en un solo entorno, pm2 es una herramienta más completa.

https://github.com/unitech/pm2

http://pm2.io

  • tiene una función de monitoreo realmente útil -> gui bonito para monitoreo de línea de comando de múltiples procesos con pm2 monit o lista de procesos con pm2 list
  • Gestión de registros organizada -> pm2 logs
  • otras cosas:
    • Configuración de comportamiento
    • Soporte de mapa fuente
    • PaaS Compatible
    • Ver y recargar
    • Sistema de módulos
    • Máxima recarga de memoria
    • Modo Cluster
    • Recarga en caliente
    • Flujo de trabajo de desarrollo
    • Guiones de inicio
    • Autocompletar
    • Flujo de trabajo de implementación
    • Monitorización keymetrics
    • API

ACTUALIZACIÓN : como se mencionó en una de las respuestas a continuación, github.com/Unitech/pm2 tiene alguna funcionalidad realmente buena que falta para siempre. Considera usarlo.

Respuesta original

Utilice nohup :

nohup node server.js &

EDITAR Quería añadir que la respuesta aceptada es realmente el camino a seguir. Estoy usando para siempre en los casos que necesitan estar despiertos. Me gusta hacer npm install -g forever así que está en la ruta del nodo y, luego, simplemente hacer que forever start server.js


Actualización 2016: la serie node-windows / mac / linux utiliza una API común en todos los sistemas operativos, por lo que es una solución absolutamente relevante. Sin embargo; node-linux genera archivos de inicio systemv. A medida que systemd continúa creciendo en popularidad, es realmente una mejor opción en Linux. PR es bienvenido si alguien quiere agregar soporte de systemd a node-linux :-)

Hilo original:

Este es un hilo bastante antiguo ahora, pero node-windows proporcionan otra forma de crear servicios en segundo plano en Windows. Se basa libremente en el concepto nssm de utilizar un contenedor exe alrededor de su script de nodo. Sin embargo; en winsw.exe lugar, utiliza winsw.exe y proporciona una envoltura de nodo configurable para un control más granular sobre cómo se inicia / detiene el proceso en caso de fallas. Estos procesos están disponibles como cualquier otro servicio:

El módulo también cuece en algún registro de eventos:

La demonización de su script se realiza a través del código. Por ejemplo:

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();

El módulo admite cosas como los reinicios de limitación (por lo que los scripts incorrectos no regulan el servidor) y los intervalos de tiempo crecientes entre reinicios.

Dado que los servicios de nodo-ventanas se ejecutan como cualquier otro, es posible administrar / monitorear el servicio con cualquier software que ya use.

Finalmente, no hay que make dependencias. En otras palabras, una npm install -g node-windows sencilla funcionará. No necesitas Visual Studio, .NET o node-gyp magic para instalar esto. Además, tiene licencia MIT y BSD.

En la divulgación completa, soy el autor de este módulo. Fue diseñado para aliviar el dolor exacto que experimentó el OP, pero con una integración más estrecha en la funcionalidad que ya ofrece el sistema operativo. Espero que a los futuros espectadores con esta misma pregunta les resulte útil.