Como faço para executar um nó.a aplicação js como serviço de apoio?

Desde que este post recebeu muita atenção ao longo dos anos, listei as melhores soluções por plataforma no fundo deste post.


publicação Original:

Quero o meu nó.js server para executar em segundo plano, ou seja: quando eu fechar meu terminal eu quero que meu servidor continue funcionando. Pesquisei isto no Google e descobri este tutorial, mas não funciona como planeado. Então, em vez de usar o script do daemon, pensei que tinha usado a saída redireccionamento( a parte 2>&1 >> file), mas isto também não sai - Eu recebo uma linha em branco no meu terminal, como se estivesse à espera de saída/erros.

Também tentei colocar o processo em segundo plano, mas assim que fechar o meu terminal, o processo também morre.

Então, como posso deixá-lo ligado quando desliguei o meu computador local?


soluções de topo:

Author: mikemaccana, 2010-10-25

24 answers

Copiar a minha própria resposta de Como faço para executar um nó.aplicação js como seu próprio processo?

2015 resposta : quase todas as distribuições Linux vêm com systemd, o que significa que para sempre, monit, etc, já não são necessárias - o seu SO já lida com estas tarefas.

Faça um ficheiro myapp.service (substituindo 'myapp' pelo nome da sua aplicação, 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

Note se você é novo no Unix: /var/www/myapp/app.js deve ter #!/usr/bin/env node no primeiro linha.

Copie o seu ficheiro de Serviço para o /etc/systemd/system.

Começa com systemctl start myapp.

Active-o para correr no arranque com systemctl enable myapp.

Ver toros com journalctl -u myapp

Isto é tirado de como implantamos aplicativos de nós no Linux, edição 2018, o que também inclui comandos para gerar um ficheiro AWS / DigitalOcean / Azure CloudConfig para criar servidores Linux / node (incluindo o ficheiro .service).

 293
Author: mikemaccana, 2018-08-12 16:09:37

Você pode usar para sempre, uma ferramenta simples de CLI para garantir que um determinado programa de nó corre continuamente (ou seja, para sempre): https://www.npmjs.org/package/forever

 231
Author: muzz, 2014-05-21 17:26:53

UPDATE - Como mencionado numa das respostas abaixo, PM2 tem uma funcionalidade muito boa faltando para sempre. Pense em usá-lo.

Resposta Original

Utilizar nohup:

nohup node server.js &

EDIT eu queria acrescentar que a resposta aceite é realmente o caminho a seguir. Estou a usar para sempre em casos que precisam de ficar acordados. Eu gosto de fazer npm install -g forever Assim que está no caminho do nó e, em seguida, apenas fazer forever start server.js

 191
Author: NG., 2015-07-17 11:19:19
Este pode não ser o caminho aceite, mas faço-o com tela, especialmente enquanto estou em desenvolvimento, porque posso trazê-lo de volta e brincar com ele, se necessário.
screen
node myserver.js
>>CTRL-A then hit D
O ecrã vai soltar-se e sobreviver à sua saída. Então você pode obtê-lo de volta fazendo screen-R. clique no manual de tela para obter mais detalhes. Podes dar nomes aos ecrãs, se quiseres.
 57
Author: UltimateBrent, 2010-10-25 19:42:57

2016 actualização: A série node-windows / mac / linux usa uma API comum em todos os sistemas operacionais, por isso é absolutamente uma solução relevante. No entanto, o node-linux gera arquivos init do systemv. Como o systemd continua a crescer em popularidade, é realisticamente uma melhor opção no Linux. Bem-vindo do PR se alguém quiser adicionar suporte do systemd ao node-linux: -)

Tópico Original:

Este é um tópico bastante antigo agora, mas o node-windows fornece outra forma de criar serviços de fundo no Windows. É vagamente baseado no conceito nssm de usar uma embalagem exe em torno do seu programa de nó. No entanto, ele usa winsw.exe em vez disso e fornece um invólucro de nó configurável para um controle mais granular sobre como o processo inicia/pára em falhas. Estes processos estão disponíveis como qualquer outro serviço:

enter image description here

O módulo também toma em algum evento de Registo:

enter image description here

A negação do teu guião está cumprida. através do Código. Por exemplo:
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();

O módulo suporta coisas como reiniciar os cappings (para que os programas maus não dêem cabo do seu servidor) e intervalos de tempo crescentes entre os reiniciamentos.

Uma vez que os Serviços de node-windows funcionam como qualquer outro, é possível gerir/monitorizar o serviço com qualquer software que já utilize.

Finalmente, não há dependências make. Em outras palavras, um simples npm install -g node-windows funcionará. Você não precisa de estúdio Visual,. NET, ou node-gyp magic para instalar presente. Além disso, tem licença do MIT e BSD.

Em plena divulgação, sou o autor deste módulo. Ele foi projetado para aliviar a dor exata que o OP experimentou, mas com uma integração mais apertada na funcionalidade que o sistema operacional já fornece. Espero que os futuros telespectadores com esta mesma pergunta a considerem útil.
 55
Author: Corey, 2016-08-12 16:49:04

UPDATE : I updated to include the latest from pm2:

Para muitos casos de uso, a utilização de um serviço systemd é a forma mais simples e apropriada de gerir um processo de nó. para aqueles que estão executando inúmeros processos de nó ou micro-serviços de nó em execução independente em um único ambiente, pm2 é uma ferramenta de destaque mais completa.

Https://github.com/unitech/pm2

Http://pm2.io

    Tem um controlo muito útil. funcionalidade - > bonita ' gui ' para a monitorização da linha de comandos de vários processos com pm2 monit ou lista de processos com pm2 list
  • Gestão de Registos organizada - > pm2 logs
  • outras coisas:
    • configuração do comportamento
    • Suporte do mapa de origem
    • PaaS Compatível
    • Ver E Recarregar
    • Sistema De Módulos
    • memória máxima recarregada
    • Modo De Agrupamento
    • recarregar a quente
    • fluxo de trabalho para o desenvolvimento
    • arranque Scripts
    • completação automática
    • fluxo de trabalho de implantação
    • Monitorização da Keymetrics
  • API
 25
Author: Hutch, 2016-10-16 16:24:11

Se você está executando o OSX, então a maneira mais fácil de produzir um verdadeiro processo do sistema é usar launchd para lançá-lo.

Crie uma lista como esta, e coloque-a na / Library/LaunchDaemons com o nome top-level-domain.your-domain.application.plist (você precisa ser root ao colocá-la):

<?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>

Quando terminar, dê isto (como raiz):

launchctl load /Library/LaunchDaemons/top-level-domain.your-domain.application.plist
launchctl start top-level-domain.your-domain.application
E tu estás a fugir.

E continuarás a correr depois de um reinício.

Para outras opções na lista veja a página do homem aqui: https://developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/man5/launchd.plist.5.html

 16
Author: Lars Christensen, 2014-09-23 15:07:34

Estou simplesmente a usar o daemon MPN Módulo:

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
});

Ultimamente também estou a usar mon(1) de TJ Holowaychuk para iniciar e gerir aplicações de nós simples.

 13
Author: LoG, 2012-07-24 14:21:00
Uso Supervisor para o desenvolvimento. Funciona. Quando fazes mudanças em A.o Supervisor de arquivos da js reinicializa automaticamente o seu aplicativo com essas alterações carregadas.

Aqui está um link para a sua página Github

Instalar:

Sudo MPN install supervisor-g

Pode facilmente fazê-lo ver outras extensões com-E. outro comando que uso frequentemente é-i para ignorar certas pastas.

Pode usar o nohup e o supervisor para fazer a aplicação de nós corre em segundo plano mesmo depois de saíres.

O supervisor do Sudo nohup myapp.js &
 12
Author: Donald Gary, 2013-10-05 16:22:18

Se você simplesmente quiser executar o script ininterruptamente até que ele termine, você pode usar nohop como já mencionado nas respostas aqui. No entanto, nenhuma das respostas fornece um comando completo que também regista stdin e stdout.

nohup node index.js >> app.log 2>&1 &
  • o {[4] } significa anexar a app.log.
  • 2>&1 garante que os erros também são enviados para stdout e adicionados ao app.log.
  • o final & garante que o seu terminal actual está desligado do comando para que possa continuar a trabalhar.

Se quiser executar um servidor de nós (ou algo que deverá iniciar quando o servidor reiniciar), deverá usar systemd / systemctl.

 10
Author: Xeoncross, 2017-10-13 15:05:26

Nó.js como um serviço de fundo em WINDOWS XP

    Parabéns vai para Hacksparrow em: http://www.hacksparrow.com/install-node-js-and-npm-on-windows.html para o nó de instalação do tutorial.js + npm para windows. Parabéns vai para Tatham Oddie em: http://blog.tatham.oddie.com.au/2011/03/16/node-js-on-windows / para o NSM.execução exe.

Instalação:

  1. instalar o WGET http://gnuwin32.sourceforge.net/packages/wget.htm via executável do instalador
  2. instalar o GIT http://code.google.com/p/msysgit/downloads/list via executável do instalador
  3. instalar o NSSM http://nssm.cc/download/?page=download por copiar o NSM.exe na pasta %windir% / system32
  4. Criar 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/");
    
  5. Abra a consola de comandos e escreva o seguinte (o setx só se o Kit de Recursos for 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
    
  6. Um bom lote é criar c:\node\ServiceMe.cmd

    @echo off
    nssm.exe install node-%~n1 "C:\Program Files\nodejs\node.exe" %~s1
    net start node-%~n1
    pause
    

Gestão Dos Serviços:

  • os próprios serviços estão agora acessíveis via Start - > Run -> servico.MSC ou via Start->Run-> msconfig-> serviços (e verificar 'Esconder Todos Os Serviços Da Microsoft").
  • o programa irá prefixar todos os nós feitos através do programa em lote com "nó -".
  • Da mesma forma, eles podem ser encontrados no registro: "HKLM\SYSTEM\CurrentControlSet\Services\node-xxxx"
 7
Author: Page2PagePro, 2012-10-18 21:44:51
A resposta aceite é provavelmente a melhor resposta de produção, mas para uma invasão rápida a fazer o trabalho do dev, encontrei isto:

nodejs scriptname.js & não funcionou, porque nodejs parecia devorar o&, e então a coisa não me deixou continuar usando o terminal sem scriptname.js a morrer.

Mas coloquei nodejs scriptname.jsnum ficheiro .sh, e Funcionou. Definitivamente não é uma coisa de produção, mas resolve o problema "eu preciso continuar usando meu terminal e não quero começar 5 terminais diferentes".
 6
Author: ArtHare, 2016-04-22 14:28:28

Se você está executando nodejs no servidor linux, eu acho que esta é a melhor maneira.

Crie um script de serviço e copie para /etc/init / nodejs.conf

Serviço de arranque: serviço de sudo nodejs start

Serviço de paragem: serviço de sudo nodejs stop

Script Sevice

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
 4
Author: Pedro Muniz, 2014-09-03 12:46:42

Tente executar este comando se estiver a usar o nohup -

nohup npm start 2>/dev/null 1>/dev/null&

Você também pode usar para sempre para iniciar o servidor

forever start -c "npm start" ./ 
 4
Author: Himanshu Teotia, 2017-03-31 07:31:56

Utilizar nssm a melhor solução para o windows, basta transferir nssm , abrir cmd para a pasta nssm e tipo

nssm install <service name> <node path> <app.js path> 

eg: nssm install myservice "C:\Program Files\nodejs" "C:\myapp\app.js" 

Isto irá instalar um novo serviço windows que será listado nos Serviços .msc a partir daí você pode iniciar ou parar o serviço, este serviço irá iniciar automaticamente e você pode configurar para reiniciar se ele falhar.

 3
Author: Aun Rizvi, 2014-03-21 12:20:03

Para completar as várias opções sugeridas, aqui está mais uma: o comando daemon no GNU / Linux, que poderá ler aqui: http://libslack.org/daemon/manpages/daemon.1.html (desculpe se isso já está mencionado em um dos comentários acima).

 2
Author: ravi, 2013-06-04 04:16:08

June 2017 Update:
Solução para Linux: (Red hat). Comentários anteriores não funcionam comigo. Isto funciona para mim no Amazon Web Service - Red Hat 7. Espero que isto funcione para alguém lá fora.

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
 2
Author: Eman Jayme, 2017-06-27 10:40:30
Vejam o fugue! Além de lançar muitos trabalhadores, você pode demonizar o seu processo de nó também!

Http://github.com/pgte/fugue

 1
Author: Shripad Krishna, 2010-10-26 05:10:05
Alguém reparou num erro trivial da posição de "2>&1" ?
2>&1 >> file

Deve ser

>> file 2>&1
 1
Author: osexp2003, 2016-02-20 13:49:56

USO o tmux para um ambiente de desenvolvimento de várias janelas/áreas em máquinas remotas. É muito simples separar e manter o processo funcionando em segundo plano. Dê uma olhada em tmux

 1
Author: Karl Pokus, 2017-03-07 08:52:17

Esta resposta é bastante tarde para a festa, mas descobri que a melhor solução era escrever um script de shell que utilizasse os comandos screen -dmS e nohup.

screen -dmS newScreenName nohup node myserver.js >> logfile.log

Eu também adiciono o bit >> logfile no final para que eu possa facilmente salvar as declarações do nó console.log().

Por que usei um script shell? Bem, eu também adicionei em uma declaração if que verificou para ver se o processo node myserver.js já estava em execução. Assim, consegui criar uma única opção de linha de comando que me permite mantenha o servidor ligado e também reiniciá-lo quando eu tiver feito alterações, o que é muito útil para o desenvolvimento.
 0
Author: Anwar Hahj Jefferson-George, 2012-04-19 15:00:29

O PM2 é um gestor de processo de produção para o Node.aplicações js com um balancer de carga embutido. Ele permite que você mantenha as aplicações vivas para sempre, para recarregá-las sem tempo de inatividade e para facilitar tarefas comuns de administração do sistema. https://github.com/Unitech/pm2

 0
Author: Arezki Lebdiri, 2015-10-09 19:15:45
Estou surpreendido por ninguém ter mencionado

Eu tentei para sempre, pm2, etc. Mas, quando se trata de métricas de controle sólido e desempenho baseado na web, eu encontreiGuvnor para ser de longe o melhor. Além disso, também é totalmente opensource.

enter image description here

Editar: no entanto, Não tenho certeza se funciona no windows. Só o usei no linux.

 0
Author: Josh, 2015-10-24 15:23:24
É muito simples.
  1. Adicionar pacote.json no seu projecto
  2. Adicione o nome ou a localização do ficheiro do programa no seu pacote.JSON Iniciar
  3. depois vá para a sua consola, abra a sua pasta do projecto pela localização do cd/para / directório /
  4. escreva nohup npm start

A seguir é uma embalagem .JSON prova que qualquer um pode usar. { "nome": "projecto",

  "version": "1.0.0",

  "main": "httpsserver.js",

  "scripts": {

    "start": "node httpsserver.js"
  },

  "keywords": [],

  "author": "",

  "license": "ISC",

  "dependencies": {},

  "devDependencies": {},

  "description": ""

}
 -1
Author: Mishi, 2017-05-17 11:01:18