2013-01-13 5 views
5

Ich habe eine NodeJS-Anwendung, die ich so laufen, über SSH:Warum hängt meine node.js-Anwendung gelegentlich, wenn ich das Terminal nicht geöffnet habe?

$ tmux 
$ node server.js 

Dies in einer tmux Sitzung meine Knoten-Anwendung startet.

Offensichtlich habe ich nicht die SSH-Sitzung öffnen die ganze Zeit.

Was ich habe ist zu finden, dass meine Bewerbung gelegentlich in einem Zustand erhalten kann, wo es nicht Server alle Seiten. Dies kann mit der Anwendung selbst zusammenhängen, oder vielleicht nur mit einer schlecht unterbrochenen SSH-Sitzung.

So oder so, einfach in SSH Protokollierung ausgeführt wird:

$ tmux attach 

Und auf die Scheibe macht Fokus geben alles wieder ansprechbar.

Ich dachte der ganze Punkt von node.js war, dass alles nicht blockierend ist - dann, was ist hier los?

+0

Hmmmm, welches Betriebssystem? – Brad

+0

@Brad: Ubuntu 12.04.1 – Eric

+0

@Eric Von Ihrer Beschreibung sollte alles funktionieren, also ist es ein Problem mit Ihrem Code. – loganfsmyth

Antwort

2

Wenn ein Fenster im Kopiermodus ist, liest tmux nicht von seinem TTY. Wenn ein Programm, das "in" im tty läuft, weiterhin eine Ausgabe erzeugt, dann wird der tty-Puffer des OS schließlich füllen und bewirken, dass der Schreibprozess/Thread blockiert. Ich kenne nicht die Interna von Node.js, aber es kann nicht erwarten, Schreibvorgänge zu stdout/stderr zu blockieren: die console functions scheinen keine Rückrufe zu haben, also können sie tatsächlich blockieren.

So könnte Node.js sehr gut enden blockiert, wenn die Scheibe in dem es im Kopiermodus verlassen wurde ausgeführt wurde, wenn der SSH-Verbindung fallen gelassen wurde.

Wenn Sie nicht blockierend Protokollierung gewährleisten müssen, dann sollten Sie umleiten (oder Tee) Ihre stdout und stderr in eine Datei und verwenden Sie so etwas wie less die früheren Protokolle anzuzeigen (Vermeidung tmux ‚s Kopiermodus weil es Blockierung verursachen könnte).

Vielleicht so etwas wie:

# 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 

Oder

# 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 

Oder, wenn Sie eine Logging-Bibliothek verwenden, könnte es etwas, das Sie automatisch in Dateien schreiben können.