在启动时运行R脚本

10

首先,这可能需要转移到超级用户。我无法决定哪个场地更好。

我正在尝试编写一个 R 脚本,在启动 / 重新启动时运行,并将该机器添加到 doRedis 工作进程池中(doRedis 是 foreach 后端)。

以下是我的 R 脚本,"~ /Rworker.R"

#Define Parameters
require(multicore)
Host <- 'ip_of_doRedis_Server'
cores <- multicore:::detectCores()
TO <- 24*3600

#Start Workers
require('doRedis')
startLocalWorkers(cores,'jobs',host=Host,port=6379, timeout = TO)

我可以使用命令行运行这个脚本,使用命令sudo R CMD BATCH ~/Rworker.R ~/RLog

接着,我编写了一个用于运行R脚本的shell脚本,名为"/etc/init.d/StartWorkers.sh"。

#!/bin/sh
sudo echo "Starting R workers"
sudo R CMD BATCH ~/Rworker.R ~/RLog

我使用 chmod +x StartWorkers.sh 命令将这个shell脚本变成了可执行文件。当我运行 ./StartWorkers.sh 命令时,R会话启动并且工作进程被添加到池中,一切都很顺利。

现在,我需要让这个shell脚本在机器启动/重新启动时运行,于是我输入了命令 update-rc.d StartWorkers.sh defaults。虽然这条命令似乎有效,但我收到以下警告信息:
'update-rc.d: warning: /etc/init.d/StartWorkers.sh missing LSB information'

尽管如此,在使用 rcconf 进行检查后,"StartWorkers.R" 已经出现在了启动列表中。

但是,当我重新启动机器时,这个脚本无法运行。我做错了什么?虽然这个shell脚本在命令行中可以正常运行,但在启动时运行却失败了。

/EDIT:好的,根据 Dirk 的回答,我安装了 littler,并将 'StartWorkers.sh' 更改为以下内容:

#! /usr/bin/r

#Define Parameters
require(multicore)
Host <- 'zachec2.dyndns.org'
cores <- multicore:::detectCores()
TO <- 24*3600

#Start Workers
require('doRedis')
startLocalWorkers(cores,'jobs',host=Host,port=6379, timeout = TO)

但是当我运行它时,会得到以下输出:

Loading required package: utils
Loading required package: multicore
Warning message:
In library(package, lib.loc = lib.loc, character.only = TRUE, logical.return = TRUE,  :
  there is no package called 'multicore'
Error in loadNamespace(name) : there is no package called 'multicore'
Calls: ::: ... tryCatch -> tryCatchList -> tryCatchOne -> <Anonymous>
Execution halted

我知道我的系统上安装了多核处理器!

/编辑2:我不得不将所有R软件包移动到cd /usr/lib/R/site-library,现在littler shell脚本可以工作了。我将脚本添加到/etc/rc.local,并且它可以完美地启动!


@Dirk Eddelbuettel:我运行了apt-get install r-cran-multicore,但现在littler找不到doRedis包,而且不幸的是apt-get install r-cran-doRedis也无法工作。 - Zach
我将所有本地软件包安装在/usr/local/lib/R/site-library中,这样所有用户都可以找到它们。如果您的软件包分散在系统中,请在library()调用中添加位置选项。 - Dirk Eddelbuettel
@Dirk Eddelbuettel:这可能是一个愚蠢的问题,但我该如何找出R安装我的软件包的位置?事实证明它不在我之前列出的4个目录中的任何一个,这解释了我的问题... - Zach
1
@Zach 启动 R 并查看 .libPaths() 的输出,它会告诉你 R 将在哪里寻找它的包。 - Gavin Simpson
@Dirk:我从交互式R会话中运行了.libPaths(),并解决了问题。谢谢。 - Zach
显示剩余11条评论
1个回答

8
这是一个涉及R问题和Ubuntu系统管理员问题的内容。以下是一些要点:
  1. 对于简单的启动任务,我建议只使用/etc/rc.local,您可以在其中添加您的任务。

  2. 我不喜欢R CMD BATCH,这就是为什么Jeff Horner和我编写了littler,它给你带来了/usr/bin/r和更容易的R脚本。 R本身也提供了Rscript;任何一个都比R CMD BATCH更好。

  3. 要测试脚本,请以root身份运行它们。一旦它们工作正常,将它们添加到/etc/rc.local中。

希望这能有所帮助。 r-sig-debian列表也是Ubuntu / Debian提示的良好来源。

我从未听说过Rscript。它是如何工作的?而且我同意...我非常讨厌R CMD BATCH。 - Zach
Rscript由R Core提供,并在Ubuntu二进制文件中作为/usr/bin/Rscript提供,因此请查看其文档。我们的/usr/bin/r(您可以使用“apt-get install littler”安装)比Rscript早一点,而且更轻更快。使用其中任何一个都会让您感到满意。 - Dirk Eddelbuettel
我已经让这个小脚本工作了,并将以下行添加到/etc/rc.localsudo /etc/init.d/StartWorkers.sh。然而,当我启动时,脚本似乎仍然没有运行。 - Zach
我去掉了sudo,将脚本从/etc/init.d/中移除,并仅通过/etc/rc.local运行它,现在它完美地工作了。非常感谢您的所有帮助,我很高兴发现littler。 - Zach
1
太棒了!很高兴看到你的坚持付出得到了回报。这些都是微小的细节,但既然你已经掌握了它们,你可以将其自动化。 - Dirk Eddelbuettel
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接