Como fazer com que um aplicativo node.js seja executado permanentemente?


259

Em um servidor Debian, instalei o Node.js. Eu entendo como iniciar um aplicativo de massa com esta linha de comando:

node /srv/www/MyUserAccount/server/server.js

e acessá-lo no endereço 50.51.52.53:8080(IP e porta).

Mas assim que fecho a massa, não consigo mais acessar o endereço 50.51.52.53:8080.

Como fazer com que um aplicativo Node.js seja executado permanentemente?

Como você pode imaginar, eu sou iniciante no Linux e Node.js.


7
Observe que pm2 é uma boa alternativa ao Forever , se você não quiser usá-lo por qualquer motivo.
Kevin B

graças @KevinB github.com/Unitech/pm2 é realmente boa alternativa
Sachin Chavan

Respostas:


221

Embora as outras respostas resolvam o problema do OP, todas elas são exageradas e não explicam por que ele está enfrentando esse problema.

A chave é esta linha: "Eu fecho a massa, então não consigo acessar o endereço"

Quando você está conectado ao seu host remoto no Putty, você inicia um processo SSH linux e todos os comandos digitados nessa sessão SSH serão executados como filhos desse processo.

Seu problema é que, quando você fecha o Putty, sai da sessão SSH que mata esse processo e qualquer processo filho ativo. Quando você fecha a massa, inadvertidamente, mata seu servidor porque o executou em primeiro plano . Para evitar esse comportamento, execute o servidor em segundo plano anexando & ao seu comando:

node /srv/www/MyUserAccount/server/server.js &

O problema aqui é a falta de conhecimento do Linux e não uma pergunta sobre o nó. Para mais informações, consulte: http://linuxconfig.org/understanding-foreground-and-background-linux-processes

ATUALIZAR:

Como outros já mencionaram, o servidor do nó ainda pode morrer ao sair do terminal. Um problema comum que me deparei é que, embora o processo do nó esteja sendo executado em bg, o stdout e o stderr ainda estão apontados para o terminal. Isso significa que, se o servidor do nó gravar em console.log ou console.error, ele receberá um erro de pipe quebrado e travará. Isso pode ser evitado canalizando a saída do seu processo:

node /srv/www/MyUserAccount/server/server.js > stdout.txt 2> stderr.txt &

Se o problema persistir, você deve procurar coisas como tmux ou nohup , que ainda são mais robustas que as soluções específicas do nó, porque elas podem ser usadas para executar todos os tipos de processos (bancos de dados, serviços de log e outros idiomas).

Um erro comum que pode causar a saída do servidor é que, após a execução, nohup node your_path/server.js &você simplesmente fecha o terminal Putty com um simples clique. Em exitvez disso, você deve usar o comando para que o servidor do nó esteja em funcionamento.


7
Se você ainda fechar a Putty Session enquanto estiver executando &o serviço, ainda assim, será fechado. (Acabei de testar no Debian Jesse)
NiCk Newman

1
Como o @NiCkNewman disse, esta resposta está incompleta! Veja a resposta de Rick Roy para a solução correta.
thejonwithnoh

19
O "&" faz com que o processo seja executado em segundo plano, mas você realmente precisará adicionar "nohup" ao início deste comando para desanexá-lo da janela do console, para que o aplicativo não pare quando a janela entrar em suspensão após alguns segundos. horas, modificando o comando mencionado anteriormente para:nohup node /srv/www/MyUserAccount/server/server.js &
SirRodge 14/02

2
AIX powersystem, nohup node myApp.js &executou o aplicativo na bg, mas morre quando o termo foi fechado. Não sei por que embora.
AnBisw

4
@ Annjawn, você precisa usar o exitcomando para sair do terminal.
Ionut Necula

342

Você pode instalar para sempre usando o npm assim:

sudo npm install -g forever

E, em seguida, inicie seu aplicativo com:

forever server.js

Ou como serviço:

forever start server.js

O Forever reinicia o aplicativo quando ele falha ou para por algum motivo. Para restringir as reinicializações a 5, você pode usar:

forever -m5 server.js

Para listar todos os processos em execução:

forever list

Observe o número inteiro entre colchetes e use-o da seguinte maneira para interromper um processo:

forever stop 0

Reiniciar um processo em execução é:

forever restart 0

Se você estiver trabalhando no arquivo do aplicativo, poderá usar o -wparâmetro para reiniciar automaticamente sempre que o server.jsarquivo for alterado:

forever -w server.js

11
@MarthaJames se seu fechamento quando seus ssh fecha sessão / janela, então você provavelmente esqueceu de incluir "start" naforever start <file>
Kristian

8
Qual a diferença entre usar forever server.jse forever start server.js? Eu sei que diz que é "como um serviço", mas o que isso significa?
Marquizzo

5
Quando digito forever server.js, ele inicia o servidor. Se eu pressionar Ctrl+ C, o serviço será interrompido. Se eu digitar forever start server.js, ele iniciará o serviço e, mesmo se eu pressionar Ctrl+, Cele permanecerá aberto. Você pode executar os outros comandos mencionados acima para parar / olhar para a lista. Foi o que experimentei pelo menos.
Termato 19/04

6
Isso inicia o script após a reinicialização do servidor?
sendoalex

1
O forevermódulo (v0.15.3) é vulnerável a Expressões Regulares ataques de negação de serviço e não deve ser usado: github.com/foreverjs/forever/issues/960
Benny Neugebauer

82

Você pode usar o PM2 , é um gerenciador de processos de produção para aplicativos Node.js. com um balanceador de carga interno.

Instale o PM2

$ npm install pm2 -g

Iniciar uma aplicação

$ pm2 start app.js

Se você estiver usando o express, poderá iniciar seu aplicativo como

pm2 start ./bin/www --name="app"

Listando todos os processos em execução:

$ pm2 list

Ele listará todo o processo. Em seguida, você pode parar / reiniciar o serviço usando o ID ou o nome do aplicativo com o seguinte comando.

$ pm2 stop all                  
$ pm2 stop 0                    
$ pm2 restart all               

Para exibir logs

$ pm2 logs ['all'|app_name|app_id]

1
Deus te abençoê! funciona!! O Forever e o Nohup não funcionam no servidor bitnami nodejs do Amazon Web Service ( docs.bitnami.com/aws/infrastructure/nodejs ). PM2 funciona muito bem!
polras 12/01

Esta biblioteca parece ter o maior número de partidas no github
DragonFire

41

Eu recomendo procurar algo como o Forever para reiniciar o Node no caso de uma falha e lidar com daemonizing isso para você.


Eu gostaria de salientar que nohup, sem , o nó será encerrado quando você sair da sessão ssh, se a executar dessa maneira (a menos que você esteja usando algo como screen no tmux).
Haozhun 25/03

1
@Haozhun, Interessante, mas não é assim que tem funcionado para mim nas minhas máquinas. Quando ssh e inicio algo usando esse comando, ele é executado para sempre em segundo plano, mesmo depois de fechar a sessão SSH.
23413 Brad

@ Brad Por favor, veja a 2ª resposta em stackoverflow.com/questions/4018154/… . Parece que algumas pessoas concordam com o primeiro comentário dessa pergunta que explica nohup. Seria ótimo se pudéssemos resolver essa confusão. Mas não sei por onde começar.
Haozhun 26/03

4
Para a maioria dos unixen (incluindo a maioria das distros do Linux), a execução de coisas em segundo plano ainda matará o processo se você fechar a janela do terminal. Para evitar isso, execute-o com nohup. Exemplo:nohup node app.js &
slebetman

1
Eu uso o Forever com um ambiente Linux de produção. Normalmente, uso o comando start forminminptpt 10000 -o /logs/myapp.log nodeApp.js
mbokil

36

Se você deseja apenas executar o aplicativo do nó no terminal sempre, basta usar a tela.

Instale no ubuntu / debian:

sudo apt-get install screen

Uso:

$ screen
$ node /path/to/app.js

ctrl + a e depois ctrl + d demitir

Obter está de volta:

Uma tela: screen -r

Se houver mais de um, você poderá listar todas as telas com: screen -ls

E depois: screen -r pid_number


1
Esta é uma boa opção, uma vez que também me permite mudar o processo para primeiro plano a qualquer momento
aexl

26

Você poderia simplesmente usar isso

nohup node /srv/www/MyUserAccount/server/server.js &

Isso manterá o aplicativo em execução e, para desligá-lo, você terá que matá-lo.

Para isso, você pode instalar htope procurar o nó e depois matá-lo


18
É importante observar que, nesse caso, o usuário precisaria sair da sessão PuTTY corretamente (ou seja, através do exitcomando). Se o usuário simplesmente fechar a janela, isso poderá usar um sinal diferente de SIGHUPfinalizar o processo e, portanto, o nó será encerrado de qualquer maneira.
thejonwithnoh

1
+1 por ser uma solução Linux simples para todos os fins para o problema. Isso é melhor que a resposta do DogNibbler .
thejonwithnoh

@thejonwithnoh depois de ler o seu comentário, tentei fechar a massa abruptamente, mas o servidor ainda funcionava, talvez tivesse a ver com a configuração do ambiente. Mas eu percebi para o que o OP estava pedindo isso seria maneira mais simples para alcançá-lo
Rick Roy

Eu gosto dessa abordagem simples, é a que eu estou usando, pois, para matá-lo, o mais fácil é apenas um killall node, que mata todos os processos de nós, no meu caso apenas um.
Nelson

@ Nelson Isso mataria todos os processos de nó, e se você tiver vários scripts em execução e quiser encerrar apenas um específico, sugiro que você encontre o processo e, em seguida, encerre esse processo em particular caso você tenha vários processos de nó em execução em um servidor de produção e falta não faça sentir como entrar em um pesadelo: D
Rick Roy

12

O Forever é um módulo NodeJs muito bom para fazer exatamente isso.

Instale foreverdigitando na linha de comando

$ npm install forever -g

Em seguida, use o seguinte comando para executar um script node.js

$ forever start /path/to/script.js

Você está pronto para ir. Além disso, você pode executar

$ forever list

para ver todos os scripts em execução. Você pode finalizar qualquer script específico digitando

$ forever stop [pid]

onde [pid]é o ID do processo do script que você obterá do listcomando. Para parar todos os scripts, você pode digitar

$ forever stopall

10

nohup funcionando, verifiquei no AWS Ubunto vm, siga as instruções corretassyntax

ubuntu@ip-172-00-00-00:~/ms$ nohup node server.js &

então pressione enter, você verá esta linha

ubuntu@ip-172-00-00-00:~/ms$ nohup: ignoring input and appending output to nohup.out

então digite isso

rm nohup.out

insira a descrição da imagem aqui


3
Eu gosto de como você apagou o nome do host na pequena festa pronta, mas deixou-o no grande título da janela 😂
conny

10

Instalação

$ [sudo] npm install forever -g

Você pode usar para sempre para executar scripts continuamente

forever start server.js

forever list

para parar o serviço

forever stop server.js

9

Aqui está uma solução inicial que tenho usado para meus projetos pessoais:

Coloque-o em /etc/init/node_app_daemon.conf:

description "Node.js Daemon"
author      "Adam Eberlin"

stop on shutdown

respawn
respawn limit 3 15

script
  export APP_HOME="/srv/www/MyUserAccount/server"
  cd $APP_HOME
  exec sudo -u user /usr/bin/node server.js
end script

Isso também lidará com o reaparecimento do seu aplicativo no caso de ele travar. Desistirá de tentar reaparecer seu aplicativo se ele travar 3 ou mais vezes em menos de 15 segundos.


9

Durante o desenvolvimento, eu recomendo usar o nodemon . Ele reiniciará o servidor sempre que um arquivo for alterado. Como outros já apontaram, o Forever é uma opção, mas na produção tudo depende da plataforma que você está usando. Você normalmente desejará usar a maneira recomendada pelo sistema operacional de manter os serviços ativos (por exemplo, http://www.freedesktop.org/wiki/Software/systemd/ ).


Isso funcionou para mim em um aplicativo MEAN.JS - nodemonexecuta o comando grunhido menos que você especifique um arquivo JS servidor, então eu estou usando isso para executar mongo e nó para sempre / simultaneamente
J-Dizzle


6

Primeiro instale o pm2 globalmente

npm install -g pm2

então comece

pm2 start bin/www 

5

Outra maneira é criar uma unidade de sistema para o seu aplicativo. crie um arquivo "XXX.service" na pasta "/ etc / systemd / system", semelhante a este:

[Unit]
Description=swagger
After=network.target

[Service]
ExecStart=/usr/bin/http-server /home/swagger/swagger-editor &
WorkingDirectory=/home/swagger
Restart=always
RestartSec=30

[Install]
WantedBy=multi-user.target

Um benefício é que o aplicativo será executado como um serviço; ele será reiniciado automaticamente se travar.

Você também pode usar o sytemctl para gerenciá-lo:

systemctl start XXXpara iniciar o serviço, systemctl stop XXXpará-lo e systemctl enable XXXiniciar automaticamente o aplicativo quando o sistema inicializar.


4

Eu espero que isso te ajude.

Na linha de comando, instale para sempre:

npm install forever -g

Crie um arquivo de exemplo:

sudo nano server.js 

Você pode editar o arquivo e obter resultados diretamente no seu navegador.
Você pode usar o filezilla ou qualquer editor para editar o arquivo. Execute este comando para executar o arquivo:

forever start --minUptime 1 --spinSleepTime 1000 -w server.js

insira a descrição da imagem aqui


4

Não há necessidade de instalar nenhum outro pacote.

Execute este comando

node server.js > stdout.txt 2> stderr.txt &

server.js é o seu arquivo de servidor ou pode ser api.js

Depois disso, pressione " exit " para fechar o terminal

exit


0

Para sempre, o pacote funcionou para mim, apenas uma coisa, depende do deep-equal , por isso, se você tiver problemas com a instalação, como:

npm -g install forever

Experimentar:

npm -g install forever deep-equal@1.1.1

em vez de.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.