在启动时运行 R 脚本

Posted

技术标签:

【中文标题】在启动时运行 R 脚本【英文标题】:Run an R script at boot 【发布时间】:2011-09-17 11:14:24 【问题描述】:

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

我正在尝试编写一个将在启动/重启时运行的 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.

接下来,我编写了一个 shell 脚本来运行 R 脚本,标题为“/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: 警告:/etc/init.d/StartWorkers.sh 缺少 LSB 信息'

但是,通过 rcconf 检查确认“StartWorkers.R”在启动列表中。

但是,当我重新启动机器时,脚本无法运行。我究竟做错了什么? shell 脚本在命令行中运行良好,但是当我尝试在启动时运行它时失败。

/编辑:好的,根据 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

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

/EDIT2:我不得不将我所有的 R 包移动到 cd /usr/lib/R/site-library,现在更小的 shell 脚本可以工作了。我将脚本添加到/etc/rc.local,它完美启动!

【问题讨论】:

我会说超级用户实际上会更好。 添加print(.libPaths())。也许您在 your ~/R/library 中拥有 root 看不到的多核。一种补救措施:apt-get install r-cran-multicore. 当我添加该行时,我在错误[1] "/usr/local/lib/R/site-library" "/usr/lib/R/site-library" [3] "/usr/lib/R/library" "/usr/lib64/R/library"之前得到以下结果@ @Dirk Eddelbuettel:我跑了apt-get install r-cran-multicore,但现在liter 找不到doRedis 包,不幸的是apt-get install r-cran-doRedis不起作用 @Zach 启动 R 并查看 .libPaths() 的输出,直到 R 会在哪里寻找它的包。 【参考方案1】:

这有点像 R 问题,有点像 Ubuntu 系统管理问题。这里有几点:

    对于简单的启动任务,我建议只使用/etc/rc.local,您可以在其中附加作业。

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

    要测试脚本,只需以 root 身份运行它们。一旦他们工作,将他们添加到/etc/rc.local

希望这会有所帮助。 r-sig-debian 列表也是 Ubuntu / Debian 技巧的一个很好的来源。

【讨论】:

我从未听说过 Rscript。这是怎么回事?我同意...我非常讨厌 R CMD BATCH。 Rscript 由 R Core 提供,并在您的 Ubuntu 二进制文件中作为 /usr/bin/Rscript 提供,因此请参阅其文档。我们的 /usr/bin/r(你可以apt-get install littler)在 Rscript 之前就出现了,而且更轻更快。玩任何一个,你都会很开心。 我得到了更小的脚本,并将以下行添加到/etc/rc.localsudo /etc/init.d/StartWorkers.sh。但是,当我启动时,脚本似乎仍然没有运行 天啊。首先,不需要 sudo,因为 /etc/rc.local 是由 root 自己执行的。其次,我建议/etc/rc.local而不是通过/etc/init.d/。第三,如果它坏了,你可以保留碎片并自己调试。鉴于您提供的信息,我们无能为力。对不起。 酷!很高兴看到你的坚持得到了回报。这些都是非常细微的细节,但现在你掌握了这些,你就可以把它自动化了。

以上是关于在启动时运行 R 脚本的主要内容,如果未能解决你的问题,请参考以下文章

在计算机启动时运行 powershell 网络脚本将失败

如何在启动时自动运行脚本?

如何在进行测试脚本录制时重新启动应用程序 inn squish

R 脚本不在 Slurm 批处理作业中运行

在 openSUSE 上启动时运行脚本

VBS脚本运行批处理文件,不在启动时运行[重复]