¿Cómo se inicia un servidor node.js como un proceso demonio?

83

En Python Twisted, tienes el twistdcomando que te ayuda con una serie de cosas relacionadas con la ejecución de tu aplicación (demonizarla, por ejemplo).

¿Cómo demonizar un servidor node.js para que pueda ejecutarse incluso después de que se cierre la sesión actual?

Gracias por tu ayuda

Jerome WAGNER
fuente
1
Consulte también stackoverflow.com/questions/4018154/…
Frosty Z

Respuestas:

92

Siempre es la respuesta a tu pregunta.

Instalar en pc

$ curl https://npmjs.org/install.sh | sh
$ npm install forever
# Or to install as a terminal command everywhere:
$ npm install -g forever

Uso

Usando Forever desde la línea de comando

$ forever start server.js

Usando una instancia de Forever de Node.js

var forever = require('forever');

  var child = new forever.Forever('your-filename.js', {
    max: 3,
    silent: true,
    args: []
  });

  child.on('exit', this.callback);
  child.start();
Baggz
fuente
7
Debería usar la opción -g para instalar globalmente. Puede que necesite permisos para hacerlo.
refaelio
1
¿Qué sucede cuando reinicia?
1
@AlexBrown: deberá agregar el forever start server.jsa un script de inicio (por ejemplo rc.local), si desea que sobreviva a los reinicios.
UpTheCreek
3
Finalmente me decidí por usar monit para iniciar y detener el proceso para siempre.
7
forever is dead, pm2 es el nuevo rey. Por favor, no pierdas tu tiempo para siempre. Acabo de cambiar y estoy asombrado. pm2 puede equilibrar la carga de su aplicación en todos los núcleos con un simple .. pm2 start app.js -i 0 --name "myapp" ... WOW ... pruébalo y no mirarás atrás para siempre ... ver @ Respuesta de Gary Bernitz
danday74
45

Si necesita que su proceso se demonice a sí mismo, sin depender para siempre, puede usar el módulo demonize .

$ npm install daemonize2

Luego simplemente escriba su archivo de servidor como en el ejemplo:

var daemon = require("daemonize2").setup({
    main: "app.js",
    name: "sampleapp",
    pidfile: "sampleapp.pid"
});

switch (process.argv[2]) {

    case "start":
        daemon.start();
        break;

    case "stop":
        daemon.stop();
        break;

    default:
        console.log("Usage: [start|stop]");
}

Eso sí, es un enfoque de bajo nivel.

Budleigh
fuente
2
Esto suena como la respuesta más correcta a la pregunta 'cómo iniciar el servidor node.js como un demonio'.
Shyam Habarakada
2
¿Qué pones en app.js? Simplemente sale para mí de inmediato.
chovy
1
¿Qué sucede al reiniciar?
mixdev
case 'restart': daemon.on('stopped', () => { daemon.start(); }); daemon.stop(); break;
davidhq
23

Para iniciar un systemddemonio de administrador de servicios, escriba un archivo de servicio. Por ejemplo, cree un archivo /etc/systemd/system/myservice.service.

[Unit]
Description=myservice-description
After=network.target

[Service]
ExecStart=/opt/myservice-location/src/node/server.js --args=here
Restart=always
User=me
Group=group
Environment=PATH=/usr/bin:/usr/local/bin
Environment=NODE_ENV=production
WorkingDirectory=/opt/myservice-location

[Install]
WantedBy=multi-user.target

Recuerde actualizar el demonio del administrador de servicios después de cada cambio en el archivo myservice.service.

$ systemctl daemon-reload

Luego, inicie el servicio en ejecución y habilite el servicio para que se inicie en el arranque.

$ systemctl start myservice
$ systemctl enable myservice
decaimiento activo
fuente
1
¿Dónde pones los argumentos adicionales para server.js en este caso?
Nikita Fuchs
19

ACTUALIZACIÓN : actualicé para incluir lo último de pm2:

para muchos casos de uso, utilizar un servicio systemd es la forma más sencilla y adecuada de gestionar 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 con más funciones.

https://github.com/unitech/pm2

http://pm2.io

  • tiene una función de monitoreo realmente útil -> bastante 'gui' para el monitoreo de línea de comandos de múltiples procesos con pm2 monit o lista de procesos conpm2 list
  • gestión organizada de registros -> pm2 logs
  • otras cosas:
    • Configuración de comportamiento
    • Soporte de mapa fuente
    • Compatible con PaaS
    • Ver y recargar
    • Sistema de módulos
    • Recarga máxima de memoria
    • Modo de grupo
    • Recarga en caliente
    • Flujo de trabajo de desarrollo
    • Scripts de inicio
    • Finalización automática
    • Flujo de trabajo de implementación
    • Monitoreo de keymetrics
    • API
Conejera
fuente
2
para siempre está muerto, pm2 es el rey! Lo he estado usando desde siempre, pero acabo de cambiar a pm2. ¡GUAUU! ¡GUAUU! ¡GUAUU! siempre ejecuta su aplicación en 1 núcleo, pm2 puede hacer lo mismo O puede equilibrar la carga de su aplicación en todos los núcleos disponibles. ¡GUAUU! no hay necesidad de trabajos cron @reboot, simplemente inicie pm2 (para iniciar pm2 como un servicio systemd o equivalente al sistema operativo) y luego pm2 save. ahora reinicie y sus aplicaciones aún se están ejecutando. Puede obtener el estado de una aplicación en ejecución con pm2 show. el reloj está disponible. ¡GUAUU! increíble ¡GUAU!
danday74
Configurar pm2 para usuarios no root en openshift es demasiado complicado.
karthik101
12

El enfoque más simple sería simplemente enviar el comando a un segundo plano.

$ node server.js &

Luego, puede finalizar el proceso en otro momento. Normalmente hago lo siguiente:

$ killall node

Nota : estoy ejecutando OS X.

raidfive
fuente
50
Tenga en cuenta que esto no funcionará si cierra la sesión de su terminal / sesión ssh. La solución completa para eso es nohup node server.js> / dev / null 2> & 1 &
Michael Dillon
@MichaelDillon ¿Por qué cree que la redirección de salidas a /dev/nulldebería incluirse en la solución completa?
nurettin
6

Puedes probar:

$ nohup node server.js &

Me funciona en Mac y Linux.

La salida estará en el ./nohup.outarchivo

Pero todavía te recomiendo que uses pm2o forever, porque se usan fácilmente para reiniciar, detener y registrar.

carril
fuente
3

Hay corredores de uso general más avanzados, como monity runit.

nponeccop
fuente
0

Para obtener información sobre la forma normal de demonizar en un sistema POSIX, puede buscar el método C.

No he visto suficientes métodos en la API de node.js para permitir que se haga en C a mano. Sin embargo, cuando usa child_process, puede hacer que node.js lo haga por usted:

http://nodejs.org/api/child_process.html#child_process_child_process_spawn_command_args_options

Considero que esto es una posible pérdida de tiempo porque es muy probable que su sistema proporcione lo mismo.

Por ejemplo:

http://libslack.org/daemon/manpages/daemon.1.html

Si desea algo portátil (multiplataforma), las otras publicaciones ofrecen soluciones que podrían ser suficientes.

jgmjgm
fuente