Как обновить до указанной версии c R на Linux (Red Hat / CentOS), сохранив предыдущую версию? - PullRequest
2 голосов
/ 07 мая 2020

A (возможно, типичное) обновление R на Linux истории ...

История:

В какой-то момент в прошлом я обновил версию R на нашем сервере RHEL / CentOS 7 с использованием версии по умолчанию, загруженной менеджером пакетов yum в то время. Например, с sudo yum install R до версии 3.5.2 в какой-то момент в начале 2019 года. По умолчанию это устанавливает R на /usr/lib64/R для всех пользователей и полностью заменяет версию 3.4.x, которая была там ранее установлена. Shiny Server уже был установлен, настроен для работы от имени пользователя shiny, и он без проблем установил новую версию R.

Ситуация:

Год позже настало время перекусить и обновить версию R, работающую на сервере Linux. Запуск yum check-upgrade R Я обнаружил, что доступна версия 3.6.0. Я действительно хочу установить 3.6.3 И я не хочу нарушать работу всех моих приложений, работающих на 3.5.2, поэтому мне нужно использовать другой метод. Следуя инструкциям на https://docs.rstudio.com/resources/install-r/, я загружаю файл 3.6.3 .rpm и устанавливаю его. По умолчанию R устанавливается по адресу /opt/R/3.6.3/, оставляя версию 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 

Сообщения об ошибках в моих блестящих файлах журнала приложений (на /var/log/shiny-server/<app name>-<user>-<datetime>.log) подтверждают, что приложения не запускались из-за отсутствия пакетов. Чтобы обновить пакеты R в папке общей библиотеки, мне нужно запустить новую версию R как sudo: sudo -i /opt/R/3.6.3/bin/R и установить необходимые пакеты, например, install.packages(c("shiny","devtools","rmarkdown","shinydashboard","tidyverse")) в R.

Теперь, когда 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.» и имеет жестко заданный путь "/ 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)?
* Переустановите «старую» версию в /opt/R/3.5.2/, используя .rpm так же, как я установил 3.6.3, установите туда пакеты, а затем удалить версию /usr/lib64/R (например, sudo yum remove R)?


Возможно, более точным заголовком было бы: «Как переключиться с локального (EPEL) R на параллельную (указанную версию c) установку R на Linux ( Red Hat / CentOS)?

Ссылки на похожие вопросы, которые я просмотрел, но не ответил на свои вопросы:

  1. Как обновить R в Linux
  2. Изменить путь в Linux
  3. Как загрузить определенную c версию R в Linux

1 Ответ

3 голосов
/ 07 мая 2020

Вопрос 1: Я не уверен, почему, но наличие нескольких версий R в вашем PATH может привести к неожиданным ситуациям, подобным этой. /usr/local/bin обычно опережает /usr/bin в PATH, поэтому я ожидал, что будет найдена R 3.6.3. Возможно, это связано с вопросом 2.

Вопрос 2: Некоторые дистрибутивы (например, CentOS / RHEL) не помещают /usr/local/bin в PATH по умолчанию при использовании sudo. Подробнее см. https://unix.stackexchange.com/questions/8646/why-are-path-variables-different-when-running-via-sudo-and-su. Ответы там описывают несколько способов добавления /usr/local/bin в PATH при использовании sudo - например, изменение secure_path в /etc/sudoers, чтобы включить /usr/local/bin, например:

Defaults    secure_path = /usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

с R 3.6. 3 перед системным R по умолчанию в PATH, вам не нужно удалять /bin/R или /usr/bin/R. Но в конечном итоге я бы порекомендовал установить несколько параллельных версий R таким же образом, используя https://docs.rstudio.com/resources/install-r/, чтобы им было легче управлять. В следующий раз, когда вы установите новую версию R, вы можете просто заменить символические ссылки в /usr/local/bin. Система R по умолчанию (от EPEL) должна быть единственной R в системе с обновлениями на месте.

Если вы хотите заменить R 3.5.2 по умолчанию на параллельную R 3.5.2 (или 3.5.3), вы можете установить R 3.5 из https://docs.rstudio.com/resources/install-r/, установить все необходимые пакеты и заставить Shiny Server использовать новый R 3.5. Затем удалите R из EPEL (R-core или R-core-devel), чтобы полностью переключиться. Оттуда вы даже можете создавать символические ссылки на R в /usr/bin вместо /usr/local/bin и не беспокоиться о добавлении /usr/local/bin в sudo PATH.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...