servicio run proyecto produccion node ejecutar correr como aplicacion node.js linux background-process

node.js - run - pm2



¿Cómo ejecutar Node.js como un proceso en segundo plano y nunca morir? (14)

Me conecto al servidor de Linux a través de masilla SSH. Traté de ejecutarlo como un proceso en segundo plano como este:

$ node server.js &

Sin embargo, después de 2,5 horas, el terminal se vuelve inactivo y el proceso muere. ¿Hay alguna forma de mantener vivo el proceso incluso con la terminal desconectada?

Editar 1

En realidad, intenté nohup , pero tan pronto como cierro el terminal Putty SSH o desconecto mi internet, el proceso del servidor se detiene de inmediato.

¿Hay algo que tenga que hacer en Putty?

Edición 2 (en febrero de 2012)

Hay un módulo node.js , forever . Ejecutará el servidor node.js como servicio de daemon.


¿Has leído sobre el comando nohup ?


Aparte de las soluciones geniales mencionadas anteriormente, también mencionaría las herramientas supervisord y monit que permiten iniciar el proceso, monitorear su presencia e iniciarla en caso de que muriera. Con ''monit'' también puede ejecutar algunas verificaciones activas, como verificar si el proceso responde a una solicitud http


Esta es una pregunta antigua, pero es alta en Google. Casi no puedo creer en las respuestas más votadas, porque ejecutar un proceso node.js dentro de una sesión de pantalla, con el indicador & o incluso con el indicador nohup (todos ellos) son solo soluciones provisionales.

Especialmente la solución de pantalla / tmux, que realmente debería considerarse una solución de aficionado . Screen y Tmux no están diseñados para mantener los procesos en ejecución, sino para multiplexar sesiones de terminal. Está bien, cuando está ejecutando un script en su servidor y desea desconectarse. Pero para un servidor node.js no desea que su proceso se adjunte a una sesión de terminal. Esto es demasiado frágil. Para mantener las cosas funcionando, ¡necesitas demonizar el proceso!

Hay un montón de buenas herramientas para hacer eso.

PM2 : pm2

# basic usage $ npm install pm2 -g $ pm2 start server.js # you can even define how many processes you want in cluster mode: $ pm2 start server.js -i 4 # you can start various processes, with complex startup settings # using an ecosystem.json file (with env variables, custom args, etc): $ pm2 start ecosystem.json

Una gran ventaja que veo a favor de PM2 es que puede generar la secuencia de comandos de inicio del sistema para que el proceso persista entre reinicios:

$ pm2 startup [platform]

Donde la platform puede ser ubuntu|centos|redhat|gentoo|systemd|darwin|amazon .

forever.js : forever

# basic usage $ npm install forever -g $ forever start app.js # you can run from a json configuration as well, for # more complex environments or multi-apps $ forever start development.json

Guiones de inicio :

No voy a entrar en detalles sobre cómo escribir un script de inicio, porque no soy un experto en este tema y sería muy largo para esta respuesta, pero básicamente son simples scripts de shell, activados por eventos del sistema operativo. Puedes leer más sobre esto here

Docker

Simplemente ejecute su servidor en un contenedor Docker con la opción -d y, ¡ voilá , tiene un servidor node.js demonizado!

Aquí hay un ejemplo de Dockerfile (de la guía oficial de node.js):

FROM node:argon # Create app directory RUN mkdir -p /usr/src/app WORKDIR /usr/src/app # Install app dependencies COPY package.json /usr/src/app/ RUN npm install # Bundle app source COPY . /usr/src/app EXPOSE 8080 CMD [ "npm", "start" ]

Luego construye tu imagen y ejecuta tu contenedor:

$ docker build -t <your username>/node-web-app . $ docker run -p 49160:8080 -d <your username>/node-web-app

Espero que esto ayude a alguien a aterrizar en esta página. Siempre use la herramienta adecuada para el trabajo. ¡Te ahorrará muchos dolores de cabeza y en horas!


Intenta esto para una solución simple

cmd y salir


Nohup y la pantalla ofrecen excelentes soluciones de luz para ejecutar Node.js en segundo plano. El administrador de procesos de Node.js ( PM2 ) es una herramienta útil para la implementación. Instálelo con npm globalmente en su sistema:

npm install pm2 -g

para ejecutar una aplicación Node.js como un demonio:

pm2 start app.js

Opcionalmente, puede vincularlo a Keymetrics.io un monitoreo SAAS realizado por Unitech.


Otra solución es rechazar el trabajo.

$ nohup node server.js & [1] 1711 $ disown -h %1


Para Ubuntu uso esto:

(exec PROG_SH &> / dev / null &)

Saludos


Para ejecutar el comando como un servicio del sistema en debian con sysv init:

Copie el script de esqueleto y adáptelo a sus necesidades, probablemente todo lo que tiene que hacer es establecer algunas variables. Su secuencia de comandos heredará valores predeterminados de /lib/init/init-d-script , si algo no se ajusta a sus necesidades: anúltela en su secuencia de comandos. Si algo sale mal, puede ver los detalles en source /lib/init/init-d-script . Las variables obligatorias son DAEMON y NAME . El script usará el start-stop-daemon para ejecutar su comando, en START_ARGS puede definir los parámetros adicionales para usar.

cp /etc/init.d/skeleton /etc/init.d/myservice chmod +x /etc/init.d/myservice nano /etc/init.d/myservice /etc/init.d/myservice start /etc/init.d/myservice stop

Así es como ejecuto algunas cosas de python para mi wiki de wikimedia:

... DESC="mediawiki articles converter" DAEMON=''/home/mss/pp/bin/nslave'' DAEMON_ARGS=''--cachedir /home/mss/cache/'' NAME=''nslave'' PIDFILE=''/var/run/nslave.pid'' START_ARGS=''--background --make-pidfile --remove-pidfile --chuid mss --chdir /home/mss/pp/bin'' export PATH="/home/mss/pp/bin:$PATH" do_stop_cmd() { start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 / $STOP_ARGS / ${PIDFILE:+--pidfile ${PIDFILE}} --name $NAME RETVAL="$?" [ "$RETVAL" = 2 ] && return 2 rm -f $PIDFILE return $RETVAL }

Además de configurar vars, tuve que reemplazar do_stop_cmd porque Python sustituye al ejecutable, por lo que el servicio no se detuvo correctamente.


Realmente deberías intentar usar la screen . Es un poco más complicado que hacer nohup long_running & , pero entender la pantalla una vez que nunca regresas.

Comience su sesión de pantalla al principio:

user@host:~$ screen

Ejecuta lo que quieras:

wget http://mirror.yandex.ru/centos/4.6/isos/i386/CentOS-4.6-i386-binDVD.iso

Presione ctrl + A y luego d. Hecho. Tu sesión sigue en segundo plano.

Puede enumerar todas las sesiones por screen -ls , y adjuntar a algunas mediante el comando screen -r 20673.pts-0.srv , donde 0673.pts-0.srv es una lista de entradas.


Tengo esta función en mi archivo shell rc, basado en la respuesta de @ Yoichi:

nohup-template () { [[ "$1" = "" ]] && echo "Example usage:/nnohup-template urxvtd" && return 0 nohup "$1" > /dev/null 2>&1 & }

Puedes usarlo de esta manera:

nohup-template "command you would execute here"


nohup node server.js > /dev/null 2>&1 &

  1. nohup significa: No termine este proceso incluso cuando el stty esté cortado.
  2. > /dev/null significa: stdout va a / dev / null (que es un dispositivo ficticio que no registra ninguna salida).
  3. 2>&1 significa: stderr también va a la salida estándar (que ya está redirigida a /dev/null ). Puede reemplazar & 1 con una ruta de archivo para mantener un registro de errores, por ejemplo: 2>/tmp/myLog
  4. & al final significa: ejecuta este comando como una tarea en segundo plano.

nohup permitirá que el programa continúe incluso después de que la terminal muera. De hecho, he tenido situaciones en las que nohup impide que la sesión SSH finalice correctamente, por lo que también debería redirigir la entrada:

$ nohup node server.js </dev/null &

Dependiendo de cómo esté configurado nohup , es posible que también deba redirigir la salida estándar y el error estándar a los archivos.


Solución simple (si no está interesado en volver al proceso, solo desea que se siga ejecutando):

nohup node server.js &

Solución poderosa (le permite reconectarse al proceso si es interactivo):

screen

Luego puede separar presionando Ctrl + a + d y luego adjuntar de nuevo ejecutando screen -r

También considere la alternativa más nueva a la pantalla, tmux.


$ disown node server.js &

Eliminará el comando de la lista de tareas activas y enviará el comando al fondo