如何让守护程序Rserve在Heroku上作为worker dyno运行

时间:2013-07-21 02:02:15

标签: r heroku daemon rserve

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

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

但是在部署到Heroku时,没有太多运气。我正在使用multipack R和节点。安装运行正常,所有构建步骤退出正常,R开始正常。

现在开始在工作器dyno上启动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”。

这使我认为某些事情从根本上是错误的,我正在尝试做什么,或者我是怎么做的。

2 个答案:

答案 0 :(得分:2)

默认情况下,Rserve作为守护程序运行,因此请使用脚本执行它,使其“正在运行”。

E.g。

# 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

答案 1 :(得分:0)

所以我尝试了十几种方法来开始使用工作器dyno,但所有都会崩溃。我从来没有深入到所有环境问题的底层 - 我在Unix上不是很专业。但是......我确实通过生成子进程来运行Rserve,在我的web dyno上的server.js初始化脚本结束时运行它。它有效。

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

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