一个(可能典型的)Linux升级R的故事...
历史:
过去的某个时候,我使用默认版本更新了我们的RHEL/CentOS 7服务器上的R版本。例如,在2019年初的某个时候,使用
yum
包管理器将其更新到版本3.5.2。默认情况下,这会为所有用户安装R在/usr/lib64/R
中,并完全替换之前安装在那里的3.4.x版本。Shiny Server已经安装,配置为以用户shiny
身份运行,并且它毫不费力地找到了新版本的R。情况:
一年后,现在是更新在Linux服务器上运行的R版本的时候了。运行
yum check-upgrade R
命令,发现可用的版本是3.6.0。实际上,我想安装3.6.3,并且我不想破坏正在运行3.5.2的所有应用程序,所以我需要使用一种不同的方法。按照https://docs.rstudio.com/resources/install-r/上的说明,下载3.6.3 .rpm文件并安装它。默认情况下,这会在/opt/R/3.6.3/
中安装R,并保留3.5.2版本不变。但是,一旦我完成创建到R的符号链接步骤,我的所有闪亮应用程序都无法工作了:sudo ln -s /opt/R/3.6.3/bin/R /usr/local/bin/R
sudo ln -s /opt/R/3.6.3/bin/Rscript /usr/local/bin/Rscript
这并不令人惊讶。 我的所有闪亮应用程序都依赖于几个尚未安装在此新版本R上的R软件包。 通过在安装所需软件包之前删除这些符号链接,我可以快速使我的应用程序在以前的版本(3.5.2)上重新运行:
sudo rm /usr/local/bin/R
sudo rm /usr/local/bin/Rscript
在我的 Shiny 应用程序日志文件中出现错误消息(位于
/var/log/shiny-server/<app name>-<user>-<datetime>.log
),确认应用程序由于缺少软件包而无法启动。要更新共享库文件夹中的 R 软件包,我需要使用 sudo 运行新版本的 R: sudo -i /opt/R/3.6.3/bin/R
并在 R 中安装必要的软件包,例如 install.packages(c("shiny","devtools","rmarkdown","shinydashboard","tidyverse"))
。现在 R 软件包已经安装完成,我可以重新创建符号链接。
sudo ln -s /opt/R/3.6.3/bin/R /usr/local/bin/R
sudo ln -s /opt/R/3.6.3/bin/Rscript /usr/local/bin/Rscript
我确认我的应用程序可以与新版的 R 正常运行。
现在我有一些问题:
问题 1:完成这些步骤后,R --version
仍然返回旧版本(3.5.2)。但是当我第二天重新登录时,它会打开 3.6.3。为什么?我需要运行终端命令来立即获取 R --version
的新版本,还是打开一个新的终端窗口是唯一的方法?
问题 2:运行 sudo R --version
总是返回旧版本(3.5.2)。运行 sudo which R
返回 /bin/R
。运行 more /bin/R
显示它的内容为“R 可执行文件的 Shell 包装器”,并且其路径硬编码为“/usr/lib64/R”。我认为此时我不需要这个包装器。如何推荐使这些 sudo 命令指向新版本?
我可以在我的主目录中备份该文件(例如:cp /bin/R ~/binR.backup
),以防万一,然后:
- 删除 /bin/R?
- 用新版本的符号链接替换 /bin/R(例如:
sudo ln -s /opt/R/3.6.3/bin/R /bin/R
)? - 使用和安装 3.6.3 相同的 .rpm 将“旧”版本重新安装到
/opt/R/3.5.2/
中,在那里安装软件包,然后删除/usr/lib64/R
版本(例如:sudo yum remove R
)?
类似的问题链接,我查看了但没有回答我问题:
/usr/local/bin
在/usr/bin
之前,但是在 sudo 下却不在那里。这似乎解决了问题1,我会进一步调查。这很明确:“默认的系统 R(来自 EPEL)应该是系统上唯一的 R,具有原地升级功能。”我没有考虑到两种安装类型是“并排”和“独立/原地”,但这种分类非常有意义。非常有帮助,谢谢! - Brian Dsudo yum remove R
,以及R-core,R-core-devel,R-devel,R-java,R-java-devel)后,sudo which R
再也找不到R的位置了(因为/usr/bin/R已被删除)。创建符号链接sudo ln -s /opt/R/3.6.3/bin/R /usr/bin/R
可以解决这个问题,正如您所说的那样。 - Brian D