2013-04-23 70 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