Назад | Перейти на главную страницу

Пути к библиотекам для каждого приложения в CentOS

Контекст:

После обновления последней версии нашего серверного программного обеспечения я оказался перед дилеммой:

У меня есть два набора приложений (Zend server и различные утилиты, а также набор утилит управления PostgreSQL), которые оба активно используют определенный файл библиотеки (libpq.so). Zend поставляется со своим собственным libpq, который является единственной версией (которую я нашел), которая будет работать со всеми вещами Zend. Postgres также поставляется со своей собственной версией библиотеки. Эти два понятия являются взаимоисключающими: если версия библиотеки Postgres находится первой в LD_LIBRARY_PATH любого пользователя, который что-то делает, все утилиты Postgres будут работать, но ни одна из утилит Zend не будет. Если сначала появится Zend, то материал Zend будет работать, а материал Postgres - нет.

Обе библиотеки имеют одинаковые имена. Пакет библиотек совместимости с PostgreSQL не работает.

В нашей среде оба набора приложений используются под множеством разных, непредсказуемых учетных записей пользователей на множестве разных компьютеров CentOS, поэтому использование «правильного пути» и установка LD_LIBRARY_PATH для каждого пользователя и указание людям «использовать только X-приложения» под учетной записью Y »работать не будет.

Вопрос:

Есть ли за приложение способ сказать «для этих двоичных файлов / приложений, выполняемых в папке X, связать с библиотекой по пути Y, но для этих других двоичных файлов, связать с библиотекой Z»? По сути, это путь к библиотеке для каждого приложения, без необходимости устанавливать LD_LIBRARY_PATH или DYLD_ * каждый раз, когда я обращаюсь к одному из приложений.

Я бы предпочел избежать перекомпиляции библиотек, так как это привело бы меня к значительным дополнительным хлопотам и тестированию каждый раз, когда выходит новая версия любого набора программного обеспечения. У меня уже есть работающие библиотеки, они просто не будут работать для обоих наборов приложений.

Встроенные пути поиска

Есть один вариант, который даст вам то, что вы хотите:

При создании приложения вы можете установить LD_RUN_PATH переменная окружения, и она будет скомпилирована в приложение. Теоретически chrpath команда позволит вам изменить встроенный путь в приложении без нужно перекомпилировать, но я никогда не тестировал это сам.

chrpath доступен в Fedora, но я не могу найти авторитетный источник, ошибся, источник.

Вы упоминаете DYLD_* переменные, которые предполагают, что вы работаете под OS X, и в этом случае вышеуказанное может не относиться к вам. Это, безусловно, верно для Linux, но компоновщик среды выполнения OS X может работать иначе (а chrpath может быть инструментом только для Linux).

Управление вашей средой

Распространенный способ управления каждым приложением LD_LIBRARY_PATH settings - это сценарий-оболочка, как предлагает ewwhite, или используя что-то вроде Модули окружения проект. Это позволяет вам упаковать настройки переменных среды (и многое другое) в отдельные блоки, чтобы вы могли делать что-то вроде:

module load myapplication

И иметь свой PATH, LD_LIBRARY_PATH, MANPATH и все остальное настроено соответствующим образом для доступа к мое заявление. А когда вы закончите, вы можете:

module unload myapplication

Чтобы отменить изменения среды.

Обычный подход к этому в моем опыте заключался в использовании сценария-оболочки для выполнения приложений. В этом сценарии оболочки LD_LIBRARY_PATH будет установлен для конкретного приложения. При желании переменная может быть сброшена после выполнения.