Регистрация пути к библиотеке с помощью ldconfig не работает должным образом - PullRequest
0 голосов
/ 01 мая 2020

Я собираю простой пакет Debian и столкнулся с ситуацией, которую я не понимаю. В пакете есть сценарий postinst, который установит новый путь конфигурации библиотеки в /etc/ld.so.conf.d и запустит ldconfig, чтобы зарегистрировать его.

#!/bin/bash
INSTALL_PREFIX=/opt/acme

if [ "$(ls -A $INSTALL_PREFIX/lib)" ]; then
  echo "$INSTALL_PREFIX/lib" > /etc/ld.so.conf.d/acme.conf
  ldconfig
fi
.
.
cp -f $INSTALL_PREFIX/scripts/acme.service /etc/systemd/system/acme.service
systemctl daemon-reload
systemctl enable acme.service
systemctl start acme.service

В служебном файле есть строка типа :

[Service]
ExecStart=/bin/sh -c '/opt/acme/bin/acme_start.sh'

, а затем в скрипте acme_start. sh он запускает мой двоичный файл.

Я вижу, что двоичный файл не запускается из-за отсутствия зависимости от библиотеки (проверено запустив на нем ldd до его запуска из сценария acme_start. sh), который был добавлен как часть сценария postinst. Если я позвоню перезапустить на сервисе, он запускается без проблем. Теперь вот что я не понимаю; если я вызываю ldconfig -v > /dev/null вместо ldconfig, он работает без проблем, и служба запускается сразу после установки.

Страница man простого ldconfig сообщает, что опция -v предназначена для многословия. Тот факт, что он может быть запущен вручную после установки без каких-либо дополнительных вмешательств, может указывать на то, что установка работала должным образом.

Есть ли что-то очевидное, чего мне не хватает, почему мой путь к библиотеке не доступен сразу после вызова в ldconfig, но после вызова ldconfig -v?

ОБНОВЛЕНИЕ: Запуск ldconfig -v -N, так что кэш не обновляется, также вызывает ту же проблему, поэтому я начинаю думать о состоянии гонки.

1 Ответ

0 голосов
/ 04 мая 2020
if [ "$(ls -A $INSTALL_PREFIX/lib)" ]   #1
then
  echo "INSTALL_PREFIX/lib" > /etc/ld.so.conf.d/acme.conf  #2
  ldconfig
fi

В строке # 1 вы, похоже, проверяете, существует ли $INSTALL_PREFIX/lib. Правильный способ проверить это: if [ -d "$INSTALL_PREFIX/lib" ]; ...

В строке # 2 вы вводите литерал INSTALL_PREFIX/lib в acme.conf. Кажется довольно ясным, что вы намеревались вместо этого повторить $INSTALL_PREFIX/lib.

У меня нет объяснения, почему ldconfig -v работает, а ldconfig нет, но исправление проблемы в строке № 2, вероятно, помочь.

...