我正在组装一个简单的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脚本中,它运行我的二进制文件。
我看到的是,由于缺少库依赖项(在从acme_start.sh脚本中启动之前在库依赖项上运行ldd来验证),二进制文件无法运行,而这些依赖项是作为postinst脚本的一部分添加的。如果我在服务上调用restart,它就会启动,没有问题。现在,这是我不明白的地方;如果我调用ldconfig -v > /dev/null而不是ldconfig,它可以正常工作,并且服务将在安装后立即启动。
ldconfig simple的手册页指出,-v选项用于详细。事实上,它也可以在安装后手动启动,而不需要任何进一步的干预,这表明安装工作如预期。
为什么我的库路径在调用ldconfig之后不能立即可用,而是在调用ldconfig -v之后可用,这是不是有什么明显的遗漏?
更新:运行ldconfig -v -N以便不更新缓存也会导致相同的问题,所以我开始考虑竞争条件。
发布于 2020-05-04 08:52:21
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行的问题可能会有所帮助。
https://stackoverflow.com/questions/61550391
复制相似问题