首先,这可能需要转移到超级用户。我无法决定哪个场地更好。
我正在尝试编写一个 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
,并且它可以完美地启动!
apt-get install r-cran-multicore
,但现在littler找不到doRedis
包,而且不幸的是apt-get install r-cran-doRedis
也无法工作。 - Zach/usr/local/lib/R/site-library
中,这样所有用户都可以找到它们。如果您的软件包分散在系统中,请在library()
调用中添加位置选项。 - Dirk Eddelbuettel.libPaths()
的输出,它会告诉你 R 将在哪里寻找它的包。 - Gavin Simpson