Dado que esta publicación ha recibido mucha atención a lo largo de los años, he enumerado 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 cierro mi terminal quiero que mi servidor siga ejecutándose. He buscado en Google esto y se me ocurrió este tutorial , sin embargo, no funciona según lo previsto. Entonces, en lugar de usar esa secuencia de comandos de daemon, pensé que solo usé la redirección de salida (la 2>&1 >> file
parte), pero esto tampoco sale: obtengo una línea en blanco en mi terminal, como si estuviera esperando salida / errores.
También he tratado de poner el proceso en segundo plano, pero tan pronto como cierro mi terminal, el proceso también se cierra.
Entonces, ¿cómo puedo dejarlo funcionando cuando apago mi computadora local?
Las mejores soluciones :
- Systemd (Linux)
- Lanzado (Mac)
- ventanas de nodo (Windows)
- PM2 (Node.js)
Respuestas:
Copiando mi propia respuesta de ¿Cómo ejecuto una aplicación Node.js como su propio proceso?
Respuesta de 2015 : casi todas las distribuciones de Linux vienen con systemd, lo que significa que para siempre, monit, PM2, etc., ya no son necesarias: su sistema operativo ya maneja estas tareas .
Cree un
myapp.service
archivo (reemplazando 'myapp' con el nombre de su aplicación, obviamente):Tenga en cuenta si es nuevo en Unix:
/var/www/myapp/app.js
debería tenerlo#!/usr/bin/env node
en la primera línea.Copie su archivo de servicio en el
/etc/systemd/system
.Comenzar 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 aplicaciones de nodo en Linux, edición 2018 , que también incluye comandos para generar un AWS / DigitalOcean / Azure CloudConfig para construir servidores Linux / nodo (incluido el
.service
archivo).fuente
~/.config/systemd/user
, iniciarlo consystemctl --user start myapp
, habilitarlo consystemctl --user enable myapp
.Puede usar Forever, una herramienta CLI simple para garantizar que un script de nodo dado se ejecute continuamente (es decir, para siempre): https://www.npmjs.org/package/forever
fuente
forever start /path/to/yourApp.js
en el script de inicio del servidor.ACTUALIZACIÓN : como se menciona en una de las respuestas a continuación, PM2 tiene una funcionalidad realmente agradable que falta para siempre. Considera usarlo.
Respuesta original
Use nohup :
EDITAR Quería agregar que la respuesta aceptada es realmente el camino a seguir. Estoy usando para siempre en instancias que necesitan mantenerse en pie. Me gusta hacerlo
npm install -g forever
, está en la ruta del nodo y luego simplemente hagoforever start server.js
fuente
nohup
significa lono hangup
que viene de los viejos tiempos, donde querías que mantuvieras un proceso vivo cuando "cuelgas" tu módem.Puede que esta no sea la forma aceptada, pero lo hago con la pantalla, especialmente durante el desarrollo, porque puedo recuperarlo y engañarlo si es necesario.
La pantalla se separará y sobrevivirá cuando cierre la sesión. Luego puede recuperarlo haciendo screen -r. Pulse el manual de la pantalla para más detalles. Puede nombrar las pantallas y otras cosas si lo desea.
fuente
Actualización de 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 systemv init. A medida que systemd continúa creciendo en popularidad, en realidad es una mejor opción en Linux. Los RP son bienvenidos si alguien quiere agregar soporte systemd a node-linux :-)
Hilo original:
Este es un hilo bastante antiguo ahora, pero node-windows proporciona otra forma de crear servicios en segundo plano en Windows. Se basa libremente en el
nssm
concepto de usar unexe
contenedor alrededor de su script de nodo. Sin embargo; en suwinsw.exe
lugar, utiliza y proporciona un contenedor 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 se hornea en algunos registros de eventos:
Daemonizar su script se logra a través del código. Por ejemplo:
El módulo admite cosas como reinicios de límite (para que los scripts incorrectos no mangueen su servidor) e intervalos de tiempo crecientes entre reinicios.
Dado que los servicios de nodo-Windows se ejecutan como cualquier otro, es posible administrar / monitorear el servicio con cualquier software que ya use.
Finalmente, no hay
make
dependencias. En otras palabras, un sencillonpm install -g node-windows
funcionará. No necesita Visual Studio, .NET o node-gyp magic para instalar esto. Además, tiene licencia MIT y BSD.En total divulgación, 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 el sistema operativo ya proporciona. Espero que los futuros espectadores con esta misma pregunta lo encuentren útil.
fuente
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 adecuada de administrar un proceso de nodo. Para aquellos que ejecutan numerosos procesos de nodo o microservicios de nodo de ejecución independiente en un solo entorno, pm2 es una herramienta más completa.
https://github.com/unitech/pm2
http://pm2.io
pm2 monit
o lista de procesos conpm2 list
pm2 logs
fuente
Si simplemente desea ejecutar el script sin interrupciones hasta que se complete, puede usarlo
nohup
como ya se mencionó en las respuestas aquí. Sin embargo, ninguna de las respuestas proporciona un comando completo que también registrestdin
ystdout
.>>
medios anexanapp.log
.2>&1
se asegura de que los errores también se envíenstdout
y se agreguen aapp.log
.&
asegura que su terminal actual esté desconectada del comando para que pueda continuar trabajando.Si desea ejecutar un servidor de nodo (o algo que debería iniciarse una vez que se reinicie el servidor) debe usar systemd / systemctl .
fuente
Si está ejecutando OSX, entonces la forma más fácil de producir un verdadero proceso del sistema es usarlo
launchd
para iniciarlo.Cree un plist como este y colóquelo en / Library / LaunchDaemons con el nombre
top-level-domain.your-domain.application.plist
(debe ser root al colocarlo):Cuando termine, emita esto (como root):
y tu estas corriendo
Y seguirá ejecutándose después de reiniciar.
Para otras opciones en la lista, vea la página de manual aquí: https://developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/man5/launchd.plist.5.html
fuente
Intente ejecutar este comando si está utilizando nohup -
También puedes usar forever para iniciar el servidor
PM2 también es compatible
npm start
fuente
pm2 start npm -- start
Simplemente estoy usando el módulo daemon npm:
Últimamente también estoy usando mon (1) de TJ Holowaychuk para iniciar y administrar aplicaciones de nodo simples.
fuente
Yo uso Supervisor para el desarrollo. Simplemente funciona Cada vez que realiza cambios en un archivo .js, Supervisor reinicia automáticamente su aplicación con esos cambios cargados.
Aquí hay un enlace a su página de Github
Instalar en pc :
Puede hacer que vea otras extensiones fácilmente con -e. Otro comando que uso 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 sesión.
fuente
Node.js como un servicio en segundo plano en WINDOWS XP
Instalación:
Crear c: \ node \ helloworld.js
Abra la consola de comandos y escriba lo siguiente (setx solo si está instalado el Kit de recursos)
Un ingenioso lote es crear c: \ node \ ServiceMe.cmd
Gestión De Servicios:
fuente
La respuesta aceptada es probablemente la mejor respuesta de producción, pero para un truco rápido haciendo 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 que scriptname.js muriera.Pero puse
nodejs scriptname.js
un archivo .sh ynohup sh startscriptname.sh &
trabajé.Definitivamente no es una cosa de producción, pero resuelve el problema "Necesito seguir usando mi terminal y no quiero iniciar 5 terminales diferentes".
fuente
Si está ejecutando nodejs en el servidor Linux, creo que esta es la mejor manera.
Cree un script de servicio y cópielo en /etc/init/nodejs.conf
servicio de inicio: inicio de sudo service nodejs
detener el servicio: sudo service nodejs stop
Secuencia de comandos de servicio
fuente
Actualización de junio de 2017:
Solución para Linux: (Red hat). Los comentarios anteriores no me funcionan. Esto funciona para mí en Amazon Web Service - Red Hat 7. Espero que esto funcione para alguien por ahí.
fuente
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 8080
qué hace. ¿Me puede dar más detalles por favor? No estoy seguro pero creo que redirige el tráfico de80
a8080
qué nodo servidor escucha, ¿verdad?use nssm la mejor solución para Windows, simplemente descargue nssm , abra cmd en el directorio nssm y escriba
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 puede configurarlo para reiniciar si falla.
fuente
Para completar las diversas opciones sugeridas, aquí hay una más: el
daemon
comando en GNU / Linux, sobre el que puede leer aquí: http://libslack.org/daemon/manpages/daemon.1.html . (disculpas si esto ya se menciona en uno de los comentarios anteriores).fuente
¡Mira la fuga! Además de lanzar muchos trabajadores, ¡también puedes demonizar tu proceso de nodo!
http://github.com/pgte/fugue
fuente
¿Alguien ha notado un error trivial de la posición de "2> y 1"?
debiera ser
fuente
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
fuente
Para las personas que usan versiones más recientes del módulo daemon npm, debe pasar descriptores de archivo en lugar de cadenas:
fuente
PM2 es un administrador de procesos de producción para aplicaciones Node.js con un equilibrador de carga incorporado. Le permite mantener las aplicaciones vivas para siempre, volver a cargarlas sin tiempo de inactividad y facilitar las tareas comunes de administración del sistema. https://github.com/Unitech/pm2
fuente
Me sorprende que nadie haya mencionado a Guvnor
Lo he intentado para siempre, pm2, etc. Pero, cuando se trata de control sólido y métricas de rendimiento basadas en la web, he encontrado que Guvnor es, con mucho, el mejor. Además, también es completamente de código abierto.
Editar: Sin embargo, no estoy seguro de si funciona en Windows. Solo lo he usado en Linux.
fuente
Como me falta esta opción en la lista de respuestas proporcionadas, me gustaría agregar una opción elegible a partir de 2020: docker o cualquier contenedor equivalente plataforma de . Además de garantizar que su aplicación funcione en un entorno estable, existen beneficios de seguridad adicionales, así como una portabilidad mejorada.
Hay compatibilidad con Docker para Windows, macOS y la mayoría / las principales distribuciones de Linux. Instalar docker en una plataforma compatible es bastante sencillo y está bien documentado. Configurar una aplicación Node.js es tan simple como ponerlo en un contenedor y ejecutar ese contenedor mientras se asegura de que se reinicie después del apagado.
Crear imagen de contenedor
Suponiendo que su aplicación esté disponible en / home / me / my-app en ese servidor, cree un archivo Dockerfile en la carpeta / home / me / my-app con contenido similar a este:
Cree la imagen usando un comando como este:
Nota: El último parámetro es seleccionar la carpeta que contiene ese Dockerfile en lugar del Dockerfile en sí. Puede elegir uno diferente usando la opción -f .
Iniciar contenedor
Use este comando para iniciar el contenedor:
Este comando asume que su aplicación está escuchando en el puerto 3000 y desea que quede expuesta en el puerto 80 de su host.
Este es un ejemplo muy limitado, pero es un buen punto de partida.
fuente
Si está usando pm2, puede usarlo con
autorestart
set tofalse
:Esto generará una muestra
ecosystem.config.js
:fuente
Esta respuesta llega bastante tarde a la fiesta, pero descubrí que la mejor solución era escribir un script de shell que utilizara los comandos
screen -dmS
ynohup
.También agrego el
>> logfile
bit al final para poder guardar fácilmente lasconsole.log()
declaraciones de nodo .¿Por qué utilicé un script de shell? Bueno, también agregué una declaración if que verificó si el
node myserver.js
proceso ya se estaba ejecutando.De esa manera pude crear una opción de línea de comando única que me permite mantener el servidor en funcionamiento y también reiniciarlo cuando he realizado cambios, lo cual es muy útil para el desarrollo.
fuente