Rscript & rstan 作为 cron 作业运行时的不同行为

问题描述

我尝试定期运行 R 脚本来更新网页。从终端调用时,脚本运行良好:

/usr/local/bin/Rscript /Users/me/path/myscript.R

但是,如果我尝试将其作为 cron 作业运行,则会出现错误。我像这样将作业添加到 crontab:

46 10 * * * /usr/local/bin/Rscript '/Users/me/path/myscript.R'  >> '/Users/me/path/mylog.log' 2>&1

该脚本确实在 R 中运行,但由于错误而中止。具体来说,我使用 rstan 拟合了一些模型,并得到了初始化错误。 (该错误仅适用于某些模型,而其他模型仍然可以正常运行。)初始化值根据定义是有效的,但似乎没有正确使用。就像 rstan 在通过 cron 运行时以不同的方式(并且是错误的)进行数学运算。

无论是在终端中运行脚本还是作为 cron 作业运行,来自 R 的会话信息都是相同的。我的问题是,根据脚本的运行方式,还有什么可能会有所不同。作为 cron 作业运行时,rstan 是否可以使用不同版本的 C++?是否还需要设置其他路径才能使其正常工作?

更新:如果我在终端中使用 R CMD BATCH 运行该脚本,该脚本也有效,但如果我在 cron 作业中使用 R CMD BATCH 则无效。使用 launchd 会触发相同的问题。我还尝试使用 Cmdstancmdstanr,同样的事情发生了:在添加到 cron 作业之前运行良好。

编辑 2:我认为在 cron 中运行良好的模型实际上并不好。结果是错误的,直到我使用了下面解释的修复程序。

解决方法

看来我终于设法解决了这个问题,我将在这里发布我的解决方案,供遇到相同问题的任何人使用。

我在终端中运行 env 以查看我当前的用户环境。我将完整的输出复制粘贴到我的 crontab 文件的顶部。 (简单地添加 PATH 变量是不够的。我想是 SHELL 或者 PATH 和 SHELL 都起到了作用,但我没有进一步探讨这一点。)

为了编辑我用户的 crontab,我运行 crontab -e,然后按 i 编辑文件,将 env 中的所有内容粘贴到文件顶部,按 {{ 停止编辑1}},然后输入 ctrl + c 并按 Enter 退出。