2013-01-13 3 views
5

Ho un'applicazione nodejs che ho eseguito come questo, su SSH:Perché la mia applicazione node.js si blocca occasionalmente quando non ho il terminale aperto?

$ tmux 
$ node server.js 

Questo inizia la mia applicazione di nodo in una sessione tmux.

Ovviamente, non ho la sessione SSH aperta tutto il tempo.

Quello che stavo scoprendo è che occasionalmente la mia applicazione può entrare in uno stato in cui non servererà alcuna pagina. Questo potrebbe essere correlato all'applicazione stessa, o forse solo a una sessione SSH scarsamente scollegata.

In entrambi i casi, semplicemente accedendo al SSH, in esecuzione:

$ tmux attach 

e dando attenzione al riquadro rende tutto ancora una volta reattivo.


ho pensato tutto il punto di node.js era che tutto è non bloccante - allora che cosa sta succedendo qui?

+0

Hmmmm, quale sistema operativo? – Brad

+0

@Brad: Ubuntu 12.04.1 – Eric

+0

@Eric Dalla tua descrizione tutto dovrebbe funzionare, quindi è un problema con il vostro codice. – loganfsmyth

risposta

2

Quando un riquadro è in modalità copia, tmux non legge dal relativo tty. Se qualche programma in esecuzione "in" nel tty continua a generare output, il buffer tty del sistema operativo si riempirà e causerà il blocco del processo di scrittura/del thread. Non conosco la struttura interna di Node.js, ma non può aspettarsi scrive su stdout/stderr al blocco: il console functions non sembrano avere callback, in modo che possano effettivamente essere bloccato.

Quindi, Node.js potrebbe benissimo finire bloccato se il pannello in cui era in esecuzione è stato lasciato in modalità copia quando la connessione SSH è stata rilasciata.

Se è necessario per assicurare la registrazione non-blocking, allora si potrebbe desiderare di reindirizzare (o T) la tua stdout e stderr in un file e usare qualcosa come less per visualizzare i log precedenti (evitando tmux 's modalità di copia poiché potrebbe causare il blocco).

Forse qualcosa di simile:

# Redirect stdout/stderr to a file, running Node.js in the background. 
# Start a "less +F" on the log so that we immediately have a "tail" running. 
node app.js >>app.log 2>&1 & less +F app.log 

O

# This pane will act as a 'tail -f', but do not use copy-mode here. 
# Instead, run e.g. 'less app.log' in another pane to review prior logs. 
node app.js 2>&1 | tee -a app.log 

Oppure, se si utilizza una libreria di registrazione, che potrebbe avere qualcosa che si può utilizzare per scrivere automaticamente ai file.