![](/img/trans.png)
[英]Proper use of LD_LIBRARY_PATH or ldconfig for a software package
[英]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.