Como faço para executar um nó.a aplicação js como serviço de apoio?
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 parte2>&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:
- Systemd (Linux)
- Launchd (Mac)
- node-windows (Windows)
- PM2 (nó.js)
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
).
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
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
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.
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:
O módulo também toma em algum evento de Registo:
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.
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
- Tem um controlo muito útil. funcionalidade - > bonita ' gui ' para a monitorização da linha de comandos de vários processos com
- 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
pm2 monit
ou lista de processos com pm2 list
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
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.
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 &
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 parastdout
e adicionados aoapp.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.
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:
- instalar o WGET http://gnuwin32.sourceforge.net/packages/wget.htm via executável do instalador
- instalar o GIT http://code.google.com/p/msysgit/downloads/list via executável do instalador
- instalar o NSSM http://nssm.cc/download/?page=download por copiar o NSM.exe na pasta %windir% / system32
-
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/");
-
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
-
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"
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.
nodejs scriptname.js
num 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".
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
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" ./
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.
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).
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>&1 >> file
Deve ser
>> file 2>&1
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
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()
.
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.
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
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.
Editar: no entanto, Não tenho certeza se funciona no windows. Só o usei no linux.
- Adicionar pacote.json no seu projecto
- Adicione o nome ou a localização do ficheiro do programa no seu pacote.JSON Iniciar
- depois vá para a sua consola, abra a sua pasta do projecto pela localização do cd/para / directório /
- 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": ""
}