Я пытаюсь запустить код R изнутри PHP. Я использую RHEL 7.4.
Однако, поскольку Apache работает от имени другого пользователя, чем установленные пакеты R, он не может загружать пакеты:
Мой PHP-код имеет следующую строку:
echo shell_exec("(Rscript -e 'library(lme4, lib.loc = \"/var/www/R/lib\")')2>&1");
который выдает эту ошибку в браузере:
Error: package or namespace load failed for 'lme4' in dyn.load(file, DLLpath = DLLpath, ...):
unable to load shared object '/var/www/R/lib/Rcpp/libs/Rcpp.so':
/var/www/R/lib/Rcpp/libs/Rcpp.so: failed to map segment from shared object: Permission denied
Execution halted
Файл /var/www/R/lib/Rcpp/libs/Rcpp.so
имеет разрешения 775, так что я не думаю, что разрешения на самом деле являются проблемой.
Как я могу сказать Apache / PHP, где искать общие библиотеки?
Сервер не является общедоступным, поэтому я бы выбрал любое решение — от правильного доступа к общей библиотеке до предоставления пользователю apache
доступ sudo с NOPASSWD
работать как мой пользователь (или что-то подобное безрассудно, так как это на самом деле не работает …).
Спасибо!
Это появляется отчасти из-за настройки SELinux в Red Hat. Я не совсем уверен, является ли это Red Hat-ориентированным или специфичным для конфигурации в моем университете (который установил Red Hat в первую очередь).
Первоначально:
$ getenforce
Enforcing
Fix:
$ sudo setenforce 0
$ getenforce
Permissive
Постоянное исправление: изменить /etc/selinux/config
иметь линию
SELINUX=Permissive
Кредит для этот StackOverflow поток.
Других решений пока нет …