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