Глобально изменить путь для всех пользователей, даже в cron

Глобально изменить путь для всех пользователей, даже в cron

Мы настраиваем кластер 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), включающий двоичные файлы и более сложную настройку. Это использовалось для инструментов, которым требуется среда, значительно отличающаяся от нашей стандартной настройки кластера.

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