2013-04-23 98 views
0

我有這個node.js服務器,它一旦產生,就會期望stdin的一些輸入。輸入不應該立即給出:我需要等待某個事件後再給予它們(例如,來自某人的連接)。如果我給出這些命令並關閉shell,那麼服務器就會關閉。我想給服務器提供輸入並關閉我的shell(有效地讓服務器運行)。在給它輸入後在後臺運行一個node.js進程

我知道要在後臺運行一個進程,我需要做的例如node my_server.js &,但這會阻止來自命令行的輸入。我想給這個輸入,然後把它放在後臺。像forever這樣的模塊會自動將它置於後臺,而不讓我通過stdin提供輸入。

此外,把腳本放在後臺在關閉shell時反正會殺死服務器。

有什麼建議嗎?

感謝

+1

我認爲你的意思是輸入必須被讀取(來自stdin)?否則,沒有什麼能阻止你使用命令行*參數*(這將是我的建議:不是讀取輸入,而是將它作爲命令行參數傳遞給腳本,並使用'process.argv'或類似[optimist ](https://github.com/substack/node-optimist)閱讀它)。 – robertklep 2013-04-23 13:56:45

+0

是的,我的意思是從標準輸入中讀取輸入內容,對於含糊不清的內容感到抱歉。我要編輯這個問題。 – Masiar 2013-04-23 14:00:22

+0

而使用命令行參數不是一個選項?另一種方法是使用文件('nohup node my_server.js robertklep 2013-04-23 14:04:59

回答

1

我也只是用的gedit在Ubuntu 12.04快速測試,和它的工作。

啓動你的節點應用程序就像這樣「node app.js arg1 arg2」,但是你想要並按回車來啓動程序。一旦你的程序開始運行,然後點擊CTRL-Z。這給你終端回來,但在後臺停止進程。現在讓它在後臺運行,只需「bg」然後回車即可。這將使該進程現在繼續運行,但在後臺運行。

您可以確認您仍在使用命令「ps -ef | grep node」,它應該顯示您的程序仍在運行。

但是,這仍然會將節點進程附加到終端窗口,因此當您關閉終端窗口時,它將關閉進程。但我認爲這會讓你看起來很快而且容易。

+1

Ctrl-Z停止(如暫停)過程!它不會繼續運行。爲了讓它在Ctrl-Z之後運行,你需要輸入「bg」讓它在後臺繼續。 – 2013-04-23 14:08:02

+0

是的,只測試一半,實際上並沒有嘗試使用它,哎呀!趕上,現在編輯迴應,以後添加bg命令 – Brian 2013-04-23 14:12:38

1

你問了任何建議,所以這裏是:讓你的服務器能夠在沒有用戶交互的情況下啓動。要做到這一點,最簡單的方法可能是創建一個包含完全按服務器所需的輸入文件,然後啓動它是這樣的:

node my_server.js < my_input.txt & 

如果需要輸入取決於什麼服務器輸出(哎喲),使用expect(1) 。如果可能的話,顛覆整個事情,並使用像commander這樣的模塊從命令行獲取輸入,而不是使用stdin。

+0

感謝您的建議。在給出一些這些輸入之前,我需要等待一些事件。即使我想避免使用其他模塊污染我的代碼,我也會檢查'commander':-)。 – Masiar 2013-04-23 14:10:13