首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ldconfig注册库路径未按预期工作

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

Stack Overflow用户
提问于 2020-05-02 04:35:35
回答 1查看 315关注 0票数 0

我正在组装一个简单的debian包,但遇到了一个我不理解的情况。该软件包有一个postinst脚本,该脚本将在/etc/ld.so.conf.d中安装一个新的库配置路径,并运行ldconfig来注册它。

代码语言:javascript
复制
#!/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

在服务文件中,它有一行代码,如:

代码语言:javascript
复制
[Service]
ExecStart=/bin/sh -c '/opt/acme/bin/acme_start.sh'

然后在acme_start.sh脚本中,它运行我的二进制文件。

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

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

为什么我的库路径在调用ldconfig之后不能立即可用,而是在调用ldconfig -v之后可用,这是不是有什么明显的遗漏?

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

EN

回答 1

Stack Overflow用户

发布于 2020-05-04 08:52:21

代码语言:javascript
复制
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行的问题可能会有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61550391

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档