2013-01-13 38 views
5

我有,我會像這樣,通過SSH一個應用程序的NodeJS:爲什麼當我沒有打開終端時,我的node.js應用程序偶爾會掛起?

$ tmux 
$ node server.js 

這將啓動一個會話TMUX我節點應用。

很明顯,我沒有一直打開SSH會話。

我一直在尋找的是,偶爾我的應用程序可能會進入一個狀態,它不會服務器上的任何頁面。這可能與應用程序本身有關,或者可能只是一個很差的SSH會話。

無論哪種方式,只要登錄到SSH,運行:

$ tmux attach 

,並給予重點窗格使一切再次響應。


我認爲node.js的全部內容是一切都是非阻塞的 - 那麼這裏發生了什麼?

+0

嗯,什麼操作系統? – Brad

+0

@Brad:Ubuntu 12.04.1 – Eric

+0

@Eric從你的描述中,一切都應該起作用,所以這是你的代碼的問題。 – loganfsmyth

回答

2

當某個窗格處於複製模式時,tmux未從其tty讀取。如果某些在tty中運行「in」的程序繼續生成輸出,那麼操作系統的tty緩衝區將最終填充並導致寫入進程/線程阻塞。我不知道Node.js的內部,但它可能不希望寫入stdout/stderr來阻止:console functions似乎沒有回調,所以它們可能實際上是阻塞的。

因此,如果您的SSH連接被刪除,Node.js最終可能會被阻止,如果它運行的窗格處於複製模式。

如果需要保證無阻塞日誌記錄,那麼你可能要重定向(或TEE)的輸出和錯誤的文件,並使用像less東西,查看之前的日誌(避免TMUX的複製模式因爲它可能會導致阻塞)。

也許是這樣的:

# 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 

或者

# 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 

或者,如果您使用的是日誌庫,它可能有東西,你可以用它來自動寫入文件。

相關問題