1

这个问题是一个晦涩难懂的问题 - 很抱歉长度。我正在尝试将应用程序部署到 Heroku。该应用程序运行Rserve - R 语言的守护程序,用于运行统计报告。原则上,这应该不会比让任何守护进程(例如 memcached)在 Heroku 中运行更困难。

在 Mac OSX 中,我只是在命令行中启动守护程序并忘记它 - 一切正常。我正在使用https://github.com/albertosantini/node-rio与 node.js 中的 Rserve 进行交互(虽然这里不是一个因素)。

但是在部署到 Heroku 时,运气不佳。我正在使用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 调用失败”。

这使我认为我正在尝试做的事情或我尝试做的事情从根本上是错误的。

4

2 回答 2

2

Rserve 默认作为守护进程运行,因此使用脚本来执行它,使其在“进程中”运行。

例如

# example R script for executing Rserve
require('Rserve')

# get the port from environment (heroku)
port <- Sys.getenv('PORT')

# run Rserve in process
run.Rserve(debug = FALSE, port, args = NULL, config.file = "rserve.conf")

然后您Procfile将有一个条目如下:

rserve: R -f rserve.r --gui-none --no-save
于 2013-10-27T10:14:02.630 回答
0

所以我尝试了十几种方法让它在工人测功机上启动,但都崩溃了。我从来没有深入了解所有环境问题——我不是 Unix 专家。但是......我确实通过在我的 web dyno 上的 server.js 初始化脚本的末尾生成一个子进程来运行 Rserve 来实现它。有用。

childProcess.exec('R CMD Rserve --no-save', function (error, stdout, stderr) {});

我的计划是在工作进程中以这种方式实现它,并使用Web Workers在不同的环境之间进行通信。

于 2013-07-22T14:06:24.540 回答