运行 Rscript 作为 cronjob 时文件打开错误

File opening error while running Rscript as cronjob

我正在尝试 运行 将 R 脚本作为具有 conda 环境的 cronjob。 运行 来自终端的脚本适用于以下 script.sh

/opt/anaconda/anaconda3/envs/{env-name}/bin/Rscript '/ABSOLUTE_PATH/script.R'  >> '/ABSOLUTE_PATH/script.log' 2>&1

但是,当将 crontab -e 中的作业定义为

30 14 * * * /ABSOLUTE_PATH/script.sh

结果 Error: package or namespace load failed for 'tidyverse' in dyn.load(file, DLLpath = DLLpath, ...): unable to load shared object '/opt/anaconda/anaconda3/envs/admenv/lib/R/library/stringi/libs/stringi.so': libicui18n.so.58: cannot open shared object file: No such file or directory Execution halted

我已经尝试运行它作为

/opt/anaconda/anaconda3/envs/{env-name}/bin/R '/ABSOLUTE_PATH/script.R' >> '/ABSOLUTE_PATH/script.log' 2>&1

source /opt/anaconda/anaconda3/bin/activate {env-name}; Rscript '/ABSOLUTE_PATH/script.R' >> '/ABSOLUTE_PATH/script.log' 2>&1

所有这些都导致了与 cronjob 相同的错误。 在 conda conda remove r-tidyverse; conda install -c r r-tidyverse 中重新安装软件包没有帮助。

使用的 R 版本是 3.6.2 和 Anaconda 4.8.2。我该如何解决这个问题?

你很可能是错误地使用了环境。无法在 bash 脚本中直接调用 Conda,因为它想使用 conda init bash 以在 shell.

中使用

我通过以下步骤成功完成了这项工作:

# Create the enviroment to be used
conda create -n r-env r-base r-essentials <other packages, for example r-tidyverse r-dbi>

接下来创建 script.sh:

conda activate r-env
Rscript <ABSOLUTE_PATH>/script.R 

然后将 cronjob 作为交互式调用(-i 选项)shell,这样可以激活 conda 环境。

# You can use obliviously any time you like
* * * * * bash -i <ABSOLUTE_PATH>/script.sh <any error streams>

使用 R 脚本测试

library(tidyverse)
library(DBI)
library(ggplot2)
print("Hello world!")

通过管道传输到外部文件。

感谢 vahvero 的精彩回复。问题似乎出在我的 conda 环境中,所以只需按照您的说明重新创建环境即可解决问题![​​=10=]