.rprofile未在cron

时间:2017-11-14 06:28:25

标签: r ubuntu cron ubuntu-16.04 rscript

我正在云上运行Ubuntu 16.04.3 LTS。当我使用Rscript从命令行运行程序时,一切都按预期进行。但是,当我通过cron使用Rscript运行相同的程序时,似乎没有调用我的.Rprofile文件。我写了一个小程序来演示这个问题:

test_cron = function() {
    #The next 3 lines are base R.
    sink('~/test_cron.out')
    on.exit(sink())
    cat('The date and time are:', as.character(Sys.time()), '\n')
    #Now try to access a personal option, set by .Rprofile.
    root = getOption('root')
    cat('Option root:', root, '\n')
}
test_cron()

我使用以下命令从命令行运行:

Rscript test_cron.r

cron_test.out文件包含以下内容:

The date and time are: 2017-11-14 06:15:46
Option root: /home/ubuntu/_algi/

crontab中的相关行如下:

20 6 * * * /usr/bin/Rscript ~/test_cron.r

当cron运行时,cron_test.out包含以下内容:

The date and time are: 2017-11-14 06:20:01
Option root:

显然,程序在由cron运行时无法访问我的个人选项“root”。这是我运行的一些实验中的一个,它让我相信.Rprofile不是在cron下调用的。有没有解决这个问题?

注意:R_PROFILE_USER环境变量设置为指向我的.Rprofile文件。显然,cron下的Rscript忽略了它。

2 个答案:

答案 0 :(得分:1)

默认情况下,R按以下特定顺序在三个位置查找并运行.Rprofile文件:

  • R_HOME:安装R的目录
  • HOME:用户的主目录
  • R的当前工作目录

。当前项目/ wd中的.Rprofile将覆盖HOME中的.Rprofile和HOME中的R_HOME和.Rprofile将覆盖R_HOME。

因此,要创建项目特定的启动脚本,只需在项目的根目录中创建.Rprofile文件即可。

在你的情况下,当cron启动脚本时,R使用不同的.Rprofile文件,而不是从命令行启动脚本。

答案 1 :(得分:0)

发现cron没有加载用户的环境。这引起了无尽的困惑和痛苦,没有普遍接受的解决方案。例如,参见

https://serverfault.com/questions/673480/load-users-environment-variables-in-a-cronjob
https://stackoverflow.com/questions/15557777/cron-job-does-not-get-the-environment-variables-set-in-bashrc
https://stackoverflow.com/questions/2229825/where-can-i-set-environment-variables-that-crontab-will-use
https://unix.stackexchange.com/questions/27289/how-can-i-run-a-cron-command-with-existing-environmental-variables

一个密切相关的问题是.bashrc只能在交互式shell ::

中运行
https://unix.stackexchange.com/questions/257571/why-does-bashrc-check-whether-the-current-shell-is-interactive

我的解决方案是编写一个shell脚本,在其中设置必要的环境变量,然后运行我的程序:

#!/bin/bash
export CODE_HOME='/home/ubuntu/'
export OS='Ubuntu'
export R_PROFILE_USER=~/R/.Rprofile
/usr/bin/Rscript ~/test_cron.r

使脚本可执行后,它在crontab下成功运行。