繁体   English   中英

使用 ldconfig 注册库路径未按预期工作

[英]Registering library path with ldconfig didn't work as expected

我正在整理一个简单的debian package,遇到了一个我不明白的情况。 package 有一个 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 脚本中运行我的二进制文件。

我看到的是由于缺少库依赖项(在从 acme_start.sh 脚本中启动之前在其上运行 ldd 进行验证),二进制文件没有运行,该依赖项是作为 postinst 脚本的一部分添加的。 如果我在服务上调用重启,它会毫无问题地启动。 现在,这是我没有得到的东西; 如果我调用ldconfig -v > /dev/null而不仅仅是ldconfig它可以正常工作,并且该服务将在安装后立即启动。

ldconfig simple 的手册页指出 -v 选项用于详细说明。 事实上,它也可以在安装后手动启动而无需任何进一步的干预,这表明安装按预期工作。

关于为什么我的库路径在调用 ldconfig 后不能立即使用,但在调用 ldconfig -v 后,我有什么明显的遗漏吗?

更新:运行ldconfig -v -N以便不更新缓存也会导致同样的问题,所以我开始考虑竞争条件。

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" ]; ... if [ -d "$INSTALL_PREFIX/lib" ]; ...

在第 2 行,您将文字INSTALL_PREFIX/lib回显到acme.conf中。 很明显,您打算回$INSTALL_PREFIX/lib

我没有解释为什么ldconfig -v有效而ldconfig无效,但是在第 2 行修复问题可能会有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM