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!
Es muy sencillo.
- Agrega package.json en tu proyecto
- Agregue el nombre del archivo de script o la ruta en su Package.JSON Start
- Luego simplemente vaya a su consola, abra el directorio de su proyecto por la ruta del CD / al directorio /
- 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
- Kudos va a Hacksparrow en: http://www.hacksparrow.com/install-node-js-and-npm-on-windows.html para el tutorial de instalación de Node.js + npm para Windows.
- Kudos va a Tatham Oddie en: http://blog.tatham.oddie.com.au/2011/03/16/node-js-on-windows/ para la implementación de nnsm.exe.
Instalación:
- Instale WGET http://gnuwin32.sourceforge.net/packages/wget.htm través del ejecutable del instalador
- Instale GIT http://code.google.com/p/msysgit/downloads/list través del ejecutable del instalador
- Instale NSSM http://nssm.cc/download/?page=download mediante la copia de nnsm.exe en la carpeta% windir% / system32
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/");
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
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 aapp.log
. -
2>&1
se asegura de que los errores también se envíen a laapp.log
y se agreguen alapp.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
- 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 conpm2 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.