【发布时间】:2013-07-21 02:02:15
【问题描述】:
这个问题是一个晦涩难懂的问题 - 抱歉,篇幅较长。我正在尝试将应用程序部署到 Heroku。该应用程序运行Rserve - R 语言的守护程序,用于运行统计报告。原则上,这应该不会比让任何守护进程(例如 memcached)在 Heroku 中运行更困难。
在 Mac OSX 中,我只是在命令行中启动守护程序并忘记它 - 一切正常。我正在使用 https://github.com/albertosantini/node-rio 与 node.js 中的 Rserve 进行交互(但这里不是一个因素)。
但是在部署到 Heroku 时,运气不佳。我正在使用multipack 的R 和节点。安装运行正常,所有构建步骤都正常退出,R 启动正常。
现在是在工作人员测功机上启动 Rserve 守护程序的工作。
我的 procfile 如下所示:
web: node server.js
worker: R CMD Rserve --no-save
当我运行它时,我在日志中收到以下错误(滚动到块末尾):
Rserv started in daemon mode.
heroku[worker.1]: State changed from starting to crashed
Rserve() 配置文档在这里:http://www.rforge.net/Rserve/doc.html我不是配置它的专家,但也许我应该在其中做些什么才能让它在这种环境中工作?
奇怪的是,您可以从 Heroku 运行控制台运行它而不会出错,但是(见下文),当我尝试从 node.js 访问它时,它似乎并没有真正运行:
heroku run R CMD Rserve
[先前保存的工作区已恢复]
Rserv 以守护程序模式启动。 >
在 node.js (heroku run node) 中,我尝试测试它:
var rio = require('rio');
rio.evaluate("pi / 2 * 2");
这会给出错误“Rserve call failed”。
这让我认为我正在尝试做的事情或我尝试做的方式存在根本性的错误。
【问题讨论】:
-
所以我尝试了十几种方法让它在工人测功机上启动,但都会崩溃。我从来没有深入了解所有环境问题——我不是 Unix 专家。但是......我确实通过在我的 web dyno 上的 server.js 初始化脚本的末尾生成一个子进程来运行 Rserve 来实现它。它有效,但它让你觉得疯狂还是脆弱?
childProcess.exec('R CMD Rserve --save', function (error, stdout, stderr) {}); -
我的计划是在worker进程中以这种方式实现它,并使用Web Workers在不同的环境之间进行通信。 github.com/pgriess/node-webworker/blob/master/README.md