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

Контекст:

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

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

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

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

Вопрос:

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

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

2 ответа

Решение

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

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

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

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

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

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

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

module load myapplication

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

module unload myapplication

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

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

Другие вопросы по тегам