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

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

2 Solutions collect form web for “Как обернуть команду так, чтобы в качестве исполняемого файла появился скрипт, а не его дочерний элемент?”

Не делай этого. Заменив исходный 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 ). Предел будет перенесен на любой процесс, запущенный из оболочки.

Чтобы, надеюсь, ответить на ваш вопрос, измените окончательную строку вашего сценария на

 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 "$@" 
  • Loginuid, должно быть разрешено изменять или нет (изменено или нет)?
  • Программа pstree и htop показывает потоки с уникальными PIDS. Как это возможно?
  • Как убить - мягко?
  • Использование ЦП операций файловой системы, не показанных сверху
  • Как сделать pgrep первым аргументом командной строки?
  • Как оболочка обрабатывает содержимое командной строки для выполнения?
  • Как убить процессы, если не было превышено ограничение root и ограничение nproc?
  • Bash unsets * _PID переменная, прежде чем я могу ждать на coproc
  • Как запустить команду на переднем плане, а затем отправить на задний план
  • Высокое ОЗУ и потребление ЦП этим процессом
  • Что это значит, когда процессы «Время» остановились сверху?
  • Interesting Posts

    Устройство USB должно быть обнаружено в «той же» / dev точке всегда?

    Подключение нескольких входов в Ghostscript

    Могу ли я ускорить вставку в vim?

    В чем разница между ioctl (), unlocked_ioctl () и compat_ioctl ()?

    Зачем учиться C вообще?

    Какие коды клавиш соответствуют запросам на включение сенсорной панели и сенсорной панели?

    Не удается «сделать» более старую версию ImageMagick

    Помогите с пониманием использования команды «equery has»

    Скрыть значки на странице приложений Gnome launcher в Fedora 26

    Какую оболочку я должен изучить для FreeBSD и Debian?

    Проблема с установкой дополнительных разделов после обновления ядра

    Как удалять команды sudo удаленно через ssh -t?

    Гостевая виртуальная машина Linux на хосте Mac – клавиатура

    Как я могу использовать переменную $ в расширении скобки оболочки последовательности?

    Как указать команду вызова для обязательной короткой или длинной опции?

    Linux и Unix - лучшая ОС в мире.