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

Resuelto Peter Kruithof asked hace 14 años • 31 respuestas

Dado que esta publicación ha recibido mucha atención a lo largo de los años, enumeré 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 funcionando. Busqué esto en Google y encontré este tutorial , sin embargo, no funciona como estaba previsto. Entonces, en lugar de usar ese script demonio, pensé que solo usé la redirección de salida (la 2>&1 >> fileparte), pero esto tampoco sale: aparece una línea en blanco en mi terminal, como si estuviera esperando salida/errores.

También intenté poner el proceso en segundo plano, pero tan pronto como cierro mi terminal, el proceso también finaliza.

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


Soluciones principales :

  • Systemd (Linux)
  • Lanzado (Mac)
  • ventanas de nodo (Windows)
  • PM2 (Nodo.js)
Peter Kruithof avatar Oct 26 '10 02:10 Peter Kruithof
Aceptado

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 siempre, monit, PM2, etc. ya no son necesarios; su sistema operativo ya maneja estas tareas .

Crea un myapp.servicearchivo (reemplazando 'myapp' con el nombre de tu 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 que si es nuevo en Unix: /var/www/myapp/app.js debe tener #!/usr/bin/env nodeen la primera línea y tener el modo ejecutable activado chmod +x app.js.

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

Empiece con systemctl start myapp.

Habilítelo para que se ejecute al arrancar con systemctl enable myapp.

Ver registros conjournalctl -u myapp

Esto está 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 .servicearchivo).

mikemaccana avatar Mar 13 '2015 22:03 mikemaccana

ACTUALIZACIÓN : como se menciona en una de las respuestas a continuación, PM2 tiene algunas funciones realmente interesantes que faltan desde siempre. Considere usarlo.

Respuesta original

Utilice nohup :

nohup node server.js &

EDITAR Quería agregar que la respuesta aceptada es realmente el camino a seguir. Lo estoy usando siempre en instancias que necesitan mantenerse activas. Me gusta hacerlo npm install -g forever, está en la ruta del nodo y luego simplemente lo hago.forever start server.js

NG. avatar Oct 25 '2010 19:10 NG.

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

muzz avatar Mar 18 '2011 01:03 muzz

Puede que esta no sea la forma aceptada, pero lo hago con la pantalla, especialmente durante el desarrollo porque puedo volver a abrirla y jugar con ella si es necesario.

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

La pantalla se separará y sobrevivirá al cierre de sesión. Luego puedes recuperarlo haciendo screen -r. Consulta el manual de pantalla para obtener más detalles. Puede nombrar las pantallas y todo eso si lo desea.

Brent avatar Oct 25 '2010 19:10 Brent