Мы настраиваем кластер SGE с CentOS 6. Мой системный администратор устанавливает приложения, которые не устанавливаются через RPM (т. е. другими способами, такими как make install), которые должны находиться в нестандартном каталоге, в данном случае что-то вроде /share/apps/install/bin/
. Путь для этого в настоящее время добавляется в большинство сеансов (login, qlogin и т. д.), через /share/apps/etc/environment.sh
которые вызывается /etc/bashrc
. environment.sh
также добавляет некоторые вещи в PERL5LIB.
Проблема, с которой я столкнулся, заключается в том, что /share/apps/install/bin
не добавляется в некоторые экземпляры, например, в вещи, вызываемые из crontab.
Я знаю, что могу вручную и явно задать это PATH=/bin:/usr/bin:/blah/blah:...
в своем личном файле crontab или в любом заданном скрипте или записи crontab, но я надеюсь, что где-то за его пределами есть настройка, /etc/profile
которая /etc/bashrc
поместит нестандартный .../bin
каталог во все переменные PATH для всех пользователей.
решение1
Добавьте файл со значением, которое вы хотите PATH
иметь в /etc/profile.d
. Эти файлы настроены на то, чтобы их использовали оболочки, такие как Bash, Csh Zsh или tcsh.
Пример
Нам необходимо было добавить следующее значение к нашему PATH.
/usr/local/share/bin
Поэтому мы создали файл /etc/profile.d/ourstuff.sh
со следующей строкой:
export PATH=/usr/local/share/bin:$PATH
Файлы с расширением .sh
загружаются такими оболочками, как Bash и Zsh. Файлы с расширением .csh
загружаются Csh и tcsh.
EDIT #1 - Продолжение
ОП задал следующий дополнительный вопрос.
Да, но что насчет заданий cron? Есть ли способ получить путь даже там? cron, похоже, не вызывает /etc/profile или /etc/bashrc.
На что я ответил:
Исправить это не делает и не будет. Вам нужно установить SHELL=/bin/bash
в cron, чтобы переопределить оболочку по умолчанию (обычно /bin/sh
). Также вы можете установить это для пользовательских cron, BASH_ENV="$HOME/.bashrc", и это для системных cron, BASH_ENV="/root/.bashrc"
. Это был бы один из способов обойти это.
Я настоятельно рекомендую вам этого не делать. Пусть скрипты, которым нужна определенная среда, настраивают ее сами. Не пытайтесь решить все проблемы на глобальном уровне!
решение2
Вы можете поместить определения переменных окружения /etc/environment
(предполагая, что ваша система загружаетpam_env
для всех служб, что должно быть значением по умолчанию на всех современных невстроенных системах Linux).
Обратите внимание, что вы можете вставлять только статические определения переменных окружения в форме VARIABLE=VALUE
или VARIABLE="VALUE"
, по одному определению на строку. Вы не можете иметь произвольные команды оболочки, вы не можете ссылаться на значение другой переменной, записывая FOO=hello+$BAR
(что помещает литерал $
в значение FOO
), и т. д. Пока вы придерживаетесь простых назначений, таких как PATH=/usr/local/bin:/usr/bin:/bin:/share/apps/install/bin
, все будет в порядке (обратите внимание, что вы не можете использовать там домашний каталог пользователя: значение должно быть одинаковым для всех пользователей).
решение3
В итоге мы пришли к многоцелевому решению, чтобы избежать любых проблем с путями. В зависимости от варианта использования мы использовали один или несколько из следующих вариантов:
- Использовались абсолютные пути к бинарным файлам, установленным в нестандартных местах, вместо того, чтобы ожидать, что бинарник будет находиться по пути. Это использовалось для инструментов, которые имеют мало, если вообще имеют, нестандартных внешних зависимостей и/или работают изолированно.
- Создал и использовал скрипт-оболочку для инструмента, который настраивал среду по мере необходимости; вручную настраивая
PATH=...
в этом скрипте и/или запускаяsource $HOME/.bashrc
по мере необходимости. Это использовалось для инструментов, которым требовались другие инструменты, но которые в остальном могли работать на нашем кластере. - Создали контейнер (в нашем случае Docker), включающий двоичные файлы и более сложную настройку. Это использовалось для инструментов, которым требуется среда, значительно отличающаяся от нашей стандартной настройки кластера.