¿Cómo ejecuto una aplicación node.js como servicio en segundo plano?
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 >> file
parte), 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)
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.service
archivo (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 node
en 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 .service
archivo).
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
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
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.