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

Я обернул свой 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 "$@" 
  • killall <имя процесса> по всей системе
  • Есть ли способ приостановить процесс, который принадлежит оболочке A, а на переднем плане - в оболочке B?
  • Что происходит с дескриптором процесса, когда процесс остановился?
  • Что может произойти между pidof и kill, чтобы вызвать «нет такого процесса»?
  • почему cpulimit делает процесс STOPPED?
  • Является ли упорный зомби-процесс признаком ошибки?
  • Открытые порты без связанных PID
  • Почему kill не имеет параметра для файла, а не для номера порта?
  • Как получить UID и PID
  • Где находится PCB на linux
  • Невозможно убить Java-процесс
  • Linux и Unix - лучшая ОС в мире.