
Я обернул свой R-скрипт /usr/lib/R/bin/exec/R
, чтобы ограничить использование памяти: я переименовал его в , /usr/lib/R/bin/exec/R_orig
а затем создал bash-скрипт с именем /usr/lib/R/bin/exec/R
и содержимым:
#!/bin/bash
echo "Memory limited to 10G"
ulimit -Sv 10000000 #limit memory for 64-bit version
/usr/lib/R/bin/exec/R_orig "$@"
Это значительно улучшило мой опыт работы с этой конкретной программой, но я обнаружил, что некоторые ее части на самом деле используют имя исполняемого файла для определения путей установки пакетов, а поскольку имя исполняемого файла изменено, они дают сбой.
Можно ли сделать так, чтобы мой скрипт /usr/lib/R/bin/exec/R
рассматривался как исполняемый файл сам по себе — так, например, чтобы top
не отображался отдельный дочерний процесс R_orig
, а отображался только сам процесс R
?
решение1
Не делайте этого. Заменив оригинал R
чем-то, что выводит строку на стандартный вывод, вы можете запутать приложения, которые могут анализировать его вывод.
Вместо этого создайте скрипт-обертку с новым именем и оставьте исходный R
исполняемый файл таким, каким он был. Не помещайте этот скрипт в , /usr/lib/R/bin/exec
а куда-нибудь вроде /usr/local/bin
(если он вообще должен быть доступен всем пользователям). Это также не будет путать последующие обновления пакетов или скрипты удаления.
В качестве альтернативы вы можете определить функцию оболочки в файлах запуска оболочки:
myR () (
echo "Memory limited to 10G"
ulimit -Sv 10000000 #limit memory for 64-bit version
exec /usr/lib/R/bin/exec/R "$@"
)
Другим очевидным вариантом было бы установить ограничение в скриптах инициализации оболочки ( ~/.bashrc
для bash
). Ограничение будет перенесено на любой процесс, запущенный из оболочки.
решение2
Чтобы ответить на ваш вопрос, измените последнюю строку вашего скрипта на
exec -a "$0" /usr/lib/R/bin/exec/R_orig "$@"
Это заменит текущий процесс (оболочку, запускающую скрипт) программой R_orig, а не запустит R_orig как дочерний процесс скрипта. Кроме того, он передаст имя программы, традиционный первый аргумент, как исходное имя. Большинство программ, которые ищут установку пакетов, будут использовать это первое имя.
Я согласен с @Kusalananda, что выводить сообщение "Memory limited to 10G" - плохая идея. Если вы хотите это сделать, то выведите его в stderr. Это значит, что ваш скрипт должен выглядеть так.
#!/bin/bash
echo "Memory limited to 10G" >&2
ulimit -Sv 10000000 #limit memory for 64-bit version
exec -a "$0" /usr/lib/R/bin/exec/R_orig "$@"