Как обернуть команду так, чтобы исполняемым файлом отображался скрипт, а не его дочерний файл?

Как обернуть команду так, чтобы исполняемым файлом отображался скрипт, а не его дочерний файл?

Я обернул свой 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 "$@"

Связанный контент