Come eseguire un'applicazione node.js in modo permanente?


259

Su un server Debian, ho installato Node.js. Capisco come avviare un'app da putty con questa riga di comando:

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

e raggiungilo sull'indirizzo 50.51.52.53:8080(IP e porta).

Ma appena chiudo lo stucco, non riesco più a raggiungere l'indirizzo 50.51.52.53:8080.

Come eseguire un'applicazione Node.js in modo permanente?

Come puoi immaginare, sono un principiante con Linux e Node.js.


7
Si noti che pm2 è una buona alternativa a Forever , se non si desidera utilizzare Forever per qualsiasi motivo.
Kevin B,

grazie @KevinB github.com/Unitech/pm2 è davvero una buona alternativa
Sachin Chavan

Risposte:


221

Sebbene le altre risposte risolvano il problema del PO, sono tutte eccessive e non spiegano il motivo per cui sta riscontrando questo problema.

La chiave è questa riga, "chiudo stucco, quindi non riesco a raggiungere l'indirizzo"

Quando sei connesso al tuo host remoto su Putty hai avviato un processo SSH Linux e tutti i comandi digitati da quella sessione SSH verranno eseguiti come figli di detto processo.

Il tuo problema è che quando chiudi Putty stai uscendo dalla sessione SSH che uccide quel processo e tutti i processi figlio attivi. Quando chiudi lo stucco, uccidi inavvertitamente il tuo server perché lo hai eseguito in primo piano . Per evitare questo comportamento, eseguire il server in background aggiungendo e al comando:

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

Il problema qui è la mancanza di conoscenza di Linux e non una domanda sul nodo. Per ulteriori informazioni, consulta: http://linuxconfig.org/understanding-foreground-and-background-linux-processes

AGGIORNARE:

Come altri hanno già detto, il server del nodo potrebbe ancora morire quando si esce dal terminale. Un gotcha comune che ho riscontrato è che anche se il processo del nodo è in esecuzione in bg, è stdout e stderr è ancora puntato sul terminale. Ciò significa che se il server del nodo scrive su console.log o console.error riceverà un errore di pipe interrotto e un arresto anomalo. Questo può essere evitato collegando l'output del processo:

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

Se il problema persiste, dovresti esaminare cose come tmux o nohup , che sono ancora più robuste delle soluzioni specifiche per nodo, perché possono essere utilizzate per eseguire tutti i tipi di processi (database, servizi di registrazione, altre lingue).

Un errore comune che potrebbe causare la nohup node your_path/server.js &chiusura del server è che dopo aver eseguito il semplice chiusura del terminale Putty con un semplice clic. Dovresti usare exitinvece il comando, quindi il tuo nodo server sarà attivo e funzionante.


7
Se comunque chiudi la Putty Session mentre fai &il servizio, comunque si chiude. (Appena testato su Debian Jesse)
NiCk Newman,

1
Come ha detto @NiCkNewman, questa risposta è incompleta! Vedi la risposta di Rick Roy per la soluzione corretta.
thejonwithnoh,

19
"&" Fa eseguire il processo in background ma in realtà sarebbe necessario aggiungere "nohup" all'inizio di questo comando per staccarlo dalla finestra della console in modo che l'applicazione non si fermi quando la finestra va in sospensione dopo alcuni ore, modificando il comando precedentemente citato in: nohup node /srv/www/MyUserAccount/server/server.js &
SirRodge

2
Powersystem AIX, nohup node myApp.js & eseguito l'app nel bg ma muore quando il termine è stato chiuso. Non so perché, però.
AnBisw

4
@Annjawn, devi usare il exitcomando per uscire dal terminale.
Necula ionica

342

Puoi installare per sempre usando npm in questo modo:

sudo npm install -g forever

E quindi avviare l'applicazione con:

forever server.js

O come servizio:

forever start server.js

Per sempre riavvia l'app quando si arresta in modo anomalo o si arresta per qualche motivo. Per limitare il riavvio a 5 è possibile utilizzare:

forever -m5 server.js

Per elencare tutti i processi in esecuzione:

forever list

Nota il numero intero tra parentesi e usalo come segue per interrompere un processo:

forever stop 0

Il riavvio di un processo in esecuzione prevede:

forever restart 0

Se stai lavorando sul file dell'applicazione, puoi utilizzare il -wparametro per riavviare automaticamente ogni volta che il server.jsfile cambia:

forever -w server.js

11
@MarthaJames se si chiude alla chiusura della sessione / finestra SSH, probabilmente hai dimenticato di includere "start" inforever start <file>
Kristian

8
Qual è la differenza tra l'utilizzo di forever server.jse forever start server.js? So che dice che è "come servizio", ma cosa significa?
Marquizzo,

5
Quando scrivo forever server.js, avvia il server. Se premo Ctrl+ C, quindi interrompe il servizio. Se digito forever start server.js, avvia il servizio e anche se premo Ctrl+ Crimane aperto. È quindi possibile eseguire gli altri comandi indicati sopra per interrompere / guardare l'elenco. Questo è quello che ho vissuto almeno.
Termato,

6
Questo avvia lo script dopo il riavvio di un server?
beingalex,

1
Il forevermodulo (v0.15.3) è vulnerabile agli attacchi Denial of Service di espressioni regolari e non deve essere utilizzato: github.com/foreverjs/forever/issues/960
Benny Neugebauer,

82

Puoi usare PM2 , è un gestore dei processi di produzione per le applicazioni Node.js con un bilanciamento del carico integrato.

Installa PM2

$ npm install pm2 -g

Avvia un'applicazione

$ pm2 start app.js

Se si utilizza express, è possibile avviare l'app come

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

Elenco di tutti i processi in esecuzione:

$ pm2 list

Elencherà tutto il processo. È quindi possibile interrompere / riavviare il servizio utilizzando ID o Nome dell'app con il seguente comando.

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

Per visualizzare i registri

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

1
Dio ti benedica! Funziona!! Forever and Nohup non funziona sul server bitnami nodejs del servizio Web Amazon ( docs.bitnami.com/aws/infrastructure/nodejs ). PM2 funziona alla grande!
polras,

Questa libreria sembra avere il maggior numero di avviamenti su github
DragonFire

41

Consiglio di cercare qualcosa come Forever per riavviare Node in caso di arresto anomalo e gestire questo daemonizzazione per te.


Vorrei sottolineare che senza nohup, il nodo uscirà quando si esce dalla sessione ssh se lo si esegue in questo modo (a meno che non si stia usando qualcosa come screen per tmux).
Haozhun,

1
@Haozhun, interessante, ma non è così che ha funzionato per me sulle mie macchine. Quando accendo e avvio qualcosa usando questo comando, viene eseguito per sempre in background, anche dopo aver chiuso la sessione SSH.
Brad

@Brad Vedere la seconda risposta su stackoverflow.com/questions/4018154/… . Sembra che alcune persone siano d'accordo con il primo commento di quella domanda che spiega nohup. Sarebbe bello se riuscissimo a risolvere questa confusione. Ma non so da dove cominciare.
Haozhun,

4
Per la maggior parte degli unixen (inclusa la maggior parte delle distro di Linux), l'esecuzione di elementi in background ucciderà comunque il processo se si chiude la finestra del terminale. Per evitare questo, eseguilo con nohup. Esempio:nohup node app.js &
slebetman,

1
Uso Forever con un ambiente di produzione Linux. Di solito uso il comando per sempre start --minUptime 10000 -o /logs/myapp.log nodeApp.js
mbokil

36

Se vuoi solo eseguire sempre l'app nodo nel terminale, usa semplicemente lo schermo.

Installa su Ubuntu / Debian:

sudo apt-get install screen

Uso:

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

ctrl + ae poi ctrl + ddi licenziare

Per tornare è tornato:

Una schermata: screen -r

Se ce n'è più di uno, puoi elencare tutte le schermate con: screen -ls

E poi: screen -r pid_number


1
Questa è una buona opzione in quanto mi permette anche di cambiare il processo in primo piano in qualsiasi momento
aexl

26

Potresti semplicemente usare questo

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

Ciò manterrà l'applicazione in esecuzione e per spegnerla dovrai ucciderla.

Per questo è possibile installare htope quindi cercare il nodo e quindi ucciderlo


18
È importante notare che in questo caso, l'utente dovrebbe uscire correttamente dalla sessione PuTTY (cioè tramite il exitcomando). Se l'utente semplicemente chiude la finestra, questo potrebbe usare un segnale diverso da quello SIGHUPper terminare il processo, e quindi il nodo si spegnerebbe comunque.
thejonwithnoh,

1
+1 per essere una semplice soluzione per tutti gli usi Linux al problema però. Questo è meglio della risposta di DogNibbler .
thejonwithnoh,

@thejonwithnoh dopo aver letto il tuo commento ho provato a chiudere bruscamente lo stucco ma il server ha ancora funzionato, forse aveva a che fare con la configurazione di env. Ma ho pensato a ciò che l'OP chiedeva sarebbe stato il modo più semplice per raggiungerlo
Rick Roy,

Mi piace questo approccio semplice, è quello che sto usando, poiché per ucciderlo, il più semplice è solo un killall node, che ucciderà tutti i processi dei nodi, nel mio caso solo uno.
Nelson,

@Nelson Questo ucciderebbe tutti i processi di nodo e se avessi più script in esecuzione e desideri terminarne solo uno specifico, ti suggerirei di trovare il processo e quindi di terminare quello specifico nel caso in cui avessi processi a più nodi in esecuzione in un server di produzione e non voglio avere voglia di entrare in un incubo: D
Rick Roy,

12

Forever è un ottimo modulo NodeJs per fare esattamente questo.

Installa foreverdigitando nella riga di comando

$ npm install forever -g

Quindi utilizzare il comando seguente per eseguire uno script node.js

$ forever start /path/to/script.js

Sei bravo ad andare. Inoltre puoi eseguire

$ forever list

per vedere tutti gli script in esecuzione. È possibile terminare qualsiasi script specifico digitando

$ forever stop [pid]

dove si [pid]trova l'ID del processo dello script che otterrai dal listcomando. Per interrompere tutti gli script, è possibile digitare

$ forever stopall

10

nohup funzionante ho controllato in AWS Ubunto vm seguire la correttasyntax

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

quindi premi invio vedrai questa linea

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

quindi digita questo

rm nohup.out

inserisci qui la descrizione dell'immagine


3
Mi piace come hai cancellato il nome host nel piccolo prompt di bash, ma lo hai lasciato nel grande titolo della finestra 😂
conny

10

Installazione

$ [sudo] npm install forever -g

È possibile utilizzare per sempre per eseguire gli script in modo continuo

forever start server.js

forever list

per servizio di arresto

forever stop server.js

9

Ecco una soluzione upstart che ho usato per i miei progetti personali:

Mettilo in /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

Questo gestirà anche la rigenerazione dell'applicazione in caso di crash. Rinuncerà ai tentativi di rigenerare l'applicazione se si blocca 3 o più volte in meno di 15 secondi.


9

Durante lo sviluppo, consiglio di usare nodemon . Riavvia il server ogni volta che cambia un file. Come altri hanno sottolineato, Forever è un'opzione, ma in produzione, tutto dipende dalla piattaforma che stai utilizzando. In genere si desidera utilizzare il modo consigliato dal sistema operativo di mantenere i servizi attivi (ad es. Http://www.freedesktop.org/wiki/Software/systemd/ ).


Questo ha funzionato per me su un'applicazione MEAN.JS - nodemonesegue il comando grunt a meno che non specifichi un file JS del server, quindi lo sto usando per eseguire mongo e node per sempre / contemporaneamente
J-Dizzle

8

Ho trovato per sempre fare il lavoro perfettamente bene.

Supponendo che abbiate già installato npm, in caso contrario, fatelo

sudo apt-get install npm

Quindi installare per sempre

npm install forever --global

Ora puoi eseguirlo in questo modo

forever start app.js

https://codingweb.io/run-nodejs-application-background/


npm rm -g per sempre per averlo rimosso
DragonFire

6

Prima installa pm2 a livello globale

npm install -g pm2

quindi iniziare

pm2 start bin/www 

5

Un altro modo è creare un'unità di sistema per la tua app. creare un file "XXX.service" nella cartella "/ etc / systemd / system", simile al seguente:

[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

Un vantaggio è che l'app verrà eseguita come servizio, si riavvierà automaticamente in caso di arresto anomalo.

Puoi anche usare Sytemctl per gestirlo:

systemctl start XXXper avviare il servizio, systemctl stop XXXper interromperlo e systemctl enable XXXper avviare automaticamente l'app all'avvio del sistema.


4

Spero che questo ti possa aiutare.

Alla riga di comando, installa per sempre:

npm install forever -g

Crea un file di esempio:

sudo nano server.js 

Puoi modificare il file e ottenere risultati direttamente nel tuo browser.
È possibile utilizzare filezilla o qualsiasi editor per modificare il file. Esegui questo comando per eseguire il file:

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

inserisci qui la descrizione dell'immagine


4

Non è necessario installare nessun altro pacchetto.

Esegui questo comando

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

server.js è il tuo file server o può essere api.js

Dopo di che premi " esci " per chiudere il terminale

exit


0

il pacchetto forever ha funzionato per me, solo una cosa, dipende da deep-equal , quindi se hai avuto problemi con l'installazione come:

npm -g install forever

Provare:

npm -g install forever deep-equal@1.1.1

anziché.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.