Como esta postagem recebeu muita atenção ao longo dos anos, listei as principais soluções por plataforma na parte inferior desta postagem.
Post original :
Eu quero que meu servidor node.js. seja executado em segundo plano, ou seja: quando eu fechar meu terminal, quero que meu servidor continue funcionando. Eu pesquisei isso no Google e criei este tutorial , mas ele não funciona conforme o esperado. Então, ao invés de usar esse script daemon, pensei 2>&1 >> file
que havia usado o redirecionamento de saída (a parte), mas isso também não sai - recebo uma linha em branco no meu terminal, como se estivesse esperando por erros / saída.
Eu também tentei colocar o processo em segundo plano, mas assim que fecho meu terminal, o processo também é interrompido.
Então, como posso deixá-lo em execução quando eu desligo o computador local?
Principais soluções :
- Systemd (Linux)
- Launchd (Mac)
- janelas do nó (Windows)
- PM2 (Node.js)
Respostas:
Copiando minha própria resposta de Como executo um aplicativo Node.js. como seu próprio processo?
Resposta de 2015 : quase todas as distribuições Linux vêm com systemd, o que significa que para sempre, monit, PM2, etc não são mais necessários - seu sistema operacional já lida com essas tarefas .
Crie um
myapp.service
arquivo (substituindo 'myapp' pelo nome do seu aplicativo, obviamente):Observe se você é novo no Unix:
/var/www/myapp/app.js
deve ter#!/usr/bin/env node
na primeira linha.Copie seu arquivo de serviço para o
/etc/systemd/system
.Comece com
systemctl start myapp
.Habilite para rodar na inicialização com
systemctl enable myapp
.Veja logs com
journalctl -u myapp
Isso é retirado de Como implantamos aplicativos de nó no Linux, edição 2018 , que também inclui comandos para gerar um AWS / DigitalOcean / Azure CloudConfig para criar servidores Linux / nó (incluindo o
.service
arquivo).fonte
~/.config/systemd/user
, iniciá-losystemctl --user start myapp
, habilitá-lo comsystemctl --user enable myapp
.Você pode usar o Forever, uma ferramenta CLI simples para garantir que um determinado script de nó seja executado continuamente (ou seja, para sempre): https://www.npmjs.org/package/forever
fonte
forever start /path/to/yourApp.js
no script de inicialização do servidor.ATUALIZAÇÃO - Conforme mencionado em uma das respostas abaixo, o PM2 tem algumas funcionalidades realmente boas que faltam para sempre. Considere usá-lo.
Resposta original
Use nohup :
Edição Gostaria de acrescentar que a resposta aceita é realmente o caminho a percorrer. Estou usando para sempre em instâncias que precisam permanecer acordadas. Eu gosto de fazê-
npm install -g forever
lo, é no caminho do nó e, em seguida, basta fazerforever start server.js
fonte
nohup
significano hangup
que vem dos velhos tempos, onde você queria manter um processo vivo quando "ligava" o modem.Essa pode não ser a maneira aceita, mas eu faço isso com a tela, especialmente durante o desenvolvimento, porque posso recuperá-la e enganá-la, se necessário.
A tela será desconectada e você sobreviverá ao fazer logoff. Então você pode recuperá-lo novamente fazendo a tela -r. Acesse o manual da tela para obter mais detalhes. Você pode nomear as telas e outros enfeites, se quiser.
fonte
Atualização de 2016: A série node-windows / mac / linux usa uma API comum em todos os sistemas operacionais, portanto é uma solução absolutamente relevante. Contudo; O node-linux gera arquivos init do systemv. À medida que o systemd continua a crescer em popularidade, é realisticamente uma opção melhor no Linux. Os PR são bem-vindos se alguém quiser adicionar suporte systemd ao node-linux :-)
Tópico original:
Este é um encadeamento bastante antigo agora, mas o node-windows fornece outra maneira de criar serviços em segundo plano no Windows. É vagamente baseado no
nssm
conceito de uso de umexe
wrapper em torno do script do nó. Contudo; ele usa emwinsw.exe
vez disso e fornece um invólucro de nó configurável para controle mais granular sobre como o processo inicia / para em falhas. Esses processos estão disponíveis como qualquer outro serviço:O módulo também utiliza alguns logs de eventos:
Daemonizing seu script é realizado através do código. Por exemplo:
O módulo suporta coisas como limitar as reinicializações (para que scripts ruins não mantenham o servidor) e intervalos de tempo crescentes entre as reinicializações.
Como os serviços node-windows são executados como qualquer outro, é possível gerenciar / monitorar o serviço com o software que você já usa.
Finalmente, não há
make
dependências. Em outras palavras, um simplesnpm install -g node-windows
funcionará. Você não precisa da mágica do Visual Studio, .NET ou node-gyp para instalar isso. Além disso, é licenciado para MIT e BSD.Na divulgação completa, sou o autor deste módulo. Ele foi projetado para aliviar a dor exata que o OP experimentou, mas com uma integração mais estreita à funcionalidade que o Sistema Operacional já oferece. Espero que os futuros espectadores com essa mesma pergunta achem útil.
fonte
UPDATE : atualizei para incluir as últimas do pm2:
para muitos casos de uso, o uso de um serviço systemd é a maneira mais simples e apropriada de gerenciar um processo do nó. para aqueles que executam vários processos de nó ou microsserviços de nó de execução independente em um único ambiente, o pm2 é uma ferramenta com mais recursos.
https://github.com/unitech/pm2
http://pm2.io
pm2 monit
ou lista de processos compm2 list
pm2 logs
fonte
Se você deseja simplesmente executar o script ininterruptamente até que seja concluído, use-o
nohup
como já mencionado nas respostas aqui. No entanto, nenhuma das respostas fornece um comando completo que também registrastdin
estdout
.>>
meios anexados aapp.log
.2>&1
garante que os erros também sejam enviadosstdout
e adicionados ao arquivoapp.log
.&
garante que o seu terminal atual esteja desconectado do comando para que você possa continuar trabalhando.Se você deseja executar um servidor de nó (ou algo que deve ser iniciado quando o servidor reiniciar), use systemd / systemctl .
fonte
Se você estiver executando o OSX, a maneira mais fácil de produzir um verdadeiro processo do sistema é usá
launchd
-lo para iniciá-lo.Crie uma lista como esta e coloque-a em / Library / LaunchDaemons com o nome
top-level-domain.your-domain.application.plist
(você precisa ser root ao colocá-la):Quando terminar, emita este (como root):
e você está correndo.
E você ainda estará executando após uma reinicialização.
Para outras opções na lista, consulte a página de manual aqui: https://developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/man5/launchd.plist.5.html
fonte
Tente executar este comando se você estiver usando nohup -
Você também pode usar para sempre para iniciar o servidor
O PM2 também suporta
npm start
fonte
pm2 start npm -- start
Estou simplesmente usando o módulo daemon npm:
Ultimamente, também estou usando o mon (1) do TJ Holowaychuk para iniciar e gerenciar aplicativos de nó simples.
fonte
Eu uso o Supervisor para desenvolvimento. Isso simplesmente funciona. Sempre que você faz alterações em um arquivo .js, o Supervisor reinicia automaticamente seu aplicativo com essas alterações carregadas.
Aqui está um link para sua página do Github
Instalar:
Você pode facilmente assistir outras extensões com -e. Outro comando que uso com freqüência é -i para ignorar determinadas pastas.
Você pode usar nohup e supervisor para fazer com que o aplicativo do nó seja executado em segundo plano, mesmo após o logout.
fonte
Node.js como um serviço em segundo plano no WINDOWS XP
Instalação:
Crie c: \ node \ helloworld.js
Abra o console de comando e digite o seguinte (setx apenas se o Resource Kit estiver instalado)
Uma boa opção de lote é criar c: \ node \ ServiceMe.cmd
Gerenciamento de serviços:
fonte
A resposta aceita é provavelmente a melhor resposta de produção, mas, para um hack rápido no trabalho de desenvolvimento, encontrei o seguinte:
nodejs scriptname.js &
não funcionou, porque o nodejs parecia devorar o &, então a coisa não me deixou continuar usando o terminal sem que o scriptname.js morresse.Mas eu coloquei
nodejs scriptname.js
em um arquivo .sh enohup sh startscriptname.sh &
trabalhei.Definitivamente não é uma coisa de produção, mas resolve o problema "Eu preciso continuar usando meu terminal e não quero iniciar 5 terminais diferentes".
fonte
Se você estiver executando o nodejs no servidor linux, acho que essa é a melhor maneira.
Crie um script de serviço e copie para /etc/init/nodejs.conf
start service: serviço sudo nodejs start
stop service: serviço sudo nodejs stop
Script sevice
fonte
Atualização de junho de 2017:
Solução para Linux: (Red hat). Comentários anteriores não funcionam para mim. Isso funciona para mim no Amazon Web Service - Red Hat 7. Espero que funcione para alguém por aí.
fonte
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 8080
o que faz. Você pode me dar mais detalhes, por favor. Não tenho certeza, mas acho que ele redireciona o tráfego80
para o8080
qual o servidor do nó escuta, certo?use o nssm a melhor solução para o windows, faça o download do nssm , abra o diretório cmd to nssm e digite
isso instalará um novo serviço do Windows que será listado em services.msc. A partir daí, você poderá iniciar ou interromper o serviço, esse serviço será iniciado automaticamente e você poderá configurar para reiniciar se falhar.
fonte
Para completar as várias opções sugeridas, aqui está mais uma: o
daemon
comando no GNU / Linux, sobre o qual você pode ler aqui: http://libslack.org/daemon/manpages/daemon.1.html . (desculpas se isso já for mencionado em um dos comentários acima).fonte
Confira fuga! Além de iniciar muitos trabalhadores, você também pode demonizar o processo do nó!
http://github.com/pgte/fugue
fonte
alguém notou um erro trivial da posição de "2> & 1"?
deveria estar
fonte
Eu uso o tmux para um ambiente de desenvolvimento de várias janelas / painéis em hosts remotos. É realmente simples desanexar e manter o processo em execução em segundo plano. Dê uma olhada no tmux
fonte
Para pessoas que usam versões mais recentes do módulo daemon npm - você precisa passar descritores de arquivo em vez de strings:
fonte
O PM2 é um gerenciador de processos de produção para aplicativos Node.js. com um balanceador de carga interno. Permite manter os aplicativos ativos para sempre, recarregá-los sem tempo de inatividade e facilitar tarefas comuns de administração do sistema. https://github.com/Unitech/pm2
fonte
Estou surpreso que ninguém tenha mencionado Guvnor
Eu tentei para sempre, pm2, etc. Mas, quando se trata de controle sólido e métricas de desempenho baseadas na Web, achei o Guvnor de longe o melhor. Além disso, também é totalmente de código aberto.
Edit: No entanto, não tenho certeza se ele funciona no Windows. Eu só usei no linux.
fonte
Como não tenho essa opção na lista de respostas fornecidas, gostaria de adicionar uma opção qualificada a partir de 2020: janela de encaixe ou qualquer contêiner equivalente plataforma de . Além de garantir que seu aplicativo esteja funcionando em um ambiente estável, existem benefícios adicionais de segurança, além de portabilidade aprimorada.
Há suporte para docker para Windows, macOS e a maioria das principais distribuições Linux. A instalação do docker em uma plataforma suportada é bastante direta e bem documentada. A configuração de um aplicativo Node.js. é tão simples quanto colocá-lo em um contêiner e executá-lo, garantindo que ele seja reiniciado após o desligamento.
Criar imagem de contêiner
Supondo que seu aplicativo esteja disponível em / home / me / my-app nesse servidor, crie um arquivo de texto Dockerfile na pasta / home / me / my-app com conteúdo semelhante a este:
Crie a imagem usando o comando como este:
Nota: O último parâmetro é selecionar a pasta que contém esse Dockerfile em vez do próprio Dockerfile. Você pode escolher um diferente usando a opção -f .
Iniciar contêiner
Use este comando para iniciar o contêiner:
Este comando pressupõe que seu aplicativo esteja escutando na porta 3000 e você deseja que seja exposto na porta 80 do seu host.
Este é um exemplo muito limitado, com certeza, mas é um bom ponto de partida.
fonte
Se você estiver usando pm2, poderá usá-lo com
autorestart
definido parafalse
:Isso irá gerar uma amostra
ecosystem.config.js
:fonte
Esta resposta é muito tarde para a festa, mas eu achei que a melhor solução era escrever um shell script que usou os ambos os
screen -dmS
enohup
comandos.Também adiciono o
>> logfile
bit no final para poder salvar facilmente asconsole.log()
instruções do nó .Por que eu usei um script de shell? Bem, eu também adicionei uma instrução if que verificou se o
node myserver.js
processo já estava em execução.Dessa forma, consegui criar uma única opção de linha de comando que permite manter o servidor funcionando e também reiniciá-lo quando eu fizer alterações, o que é muito útil para o desenvolvimento.
fonte