【问题标题】:LD_LIBRARY_PATH side effectsLD_LIBRARY_PATH 副作用
【发布时间】:2012-06-09 14:54:59
【问题描述】:

我在更改 LD_LIBRARY_PATH 时有奇怪的副作用。

当我附加包含库的路径时,例如:

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/my_path/lib

然后,一切都变得异常缓慢。例如,一个简单的ls 可以长达 10 秒。

ldd 输出在LD_LIBRARY_PATH 更改之前和之后完全相同,我尝试使用strace 调试慢速ls 的执行:在这两种情况下我得到完全相同的执行。在ls 的执行过程中甚至不会卡住(因为strace 在10 秒的延迟期间没有输出任何东西,然后突然完美地执行ls)。所以我认为它可能来自我的 shell,但这是一样的,在我的 bash 上运行 strace 并在两种情况下执行 ls 给我相同的 strace 输出:shell 执行 ls 并等待执行结束(延迟strace 之前的最后一个strace 输出是waitpid(...))。所以我猜想在ls 的启动和它的执行之间发生了一些错误,就像它是一个内核级别的问题一样。就像在ls 上创建了sleep(0 cpu 使用率)。

在延迟期间,我的 CPU 和网络活动完全正常...

请注意,新 LD 路径中的库不与任何“标准库”冲突,因此在我的示例中不会干扰 ls

所以我对LD_LIBRARY_PATH 副作用或如何深入调试我的示例的深入解释很感兴趣。

【问题讨论】:

  • 好问题。我使用过LD_LIBRARY_PATH 并且从未见过这种行为,但您的观察似乎既孤立又清晰。很有趣。
  • export LD_DEBUG=allman 8 ld.so
  • 很明显,但如果 ls 使用 LD_LIBRARY_PATH 中的任何内容,“ldd $(which ls)”可能会提供线索。
  • 有趣。您是否尝试从新路径中删除库文件?还是用标准库的副本替换它?
  • @thb @Thomas @Matthias :我找到了导致滞后的原因,但不明白为什么(感谢LD_DEBUG=all):LD_LIBRARY_PATH 中不存在一条路径,这条路径在远程服务器上...但是同一台服务器上还有其他路径,它们绝对不会引起任何问题...

标签: linux bash unix ld


【解决方案1】:

我不确定您的 LD_LIBRARY_PATH 或您尝试添加的库或您正在运行的程序上还有什么,但您最好编写一个包装脚本来更改 LD_LIBRARY_PATH 只为需要的程序额外的库,这样您的系统功能(如ls)就不会受到影响。

#!/bin/bash
export LD_LIBRARY_PATH=/my_path/lib
program_name

创建文件和chmod +x wrapper_name

【讨论】:

    【解决方案2】:

    这篇文章已经过时了,所以我不知道你是否已经找到了解决方案。无论如何,我不知道这是否有帮助,但在大多数现代 GNU/Linux 系统中,不推荐使用 LD_LIBRARY_PATH 并且不鼓励使用。

    因此我有几个建议:

    1. 如果您想继续使用它,请先尝试通过预先挂起而不是将库路径附加到 LD_LIBRARY_PATH。如果在以前的库目录中扫描路径需要很长时间,这应该会有所帮助。

    2. 使用 LDCONFIG 系统,这是当今使用 LD 目录的(新)正确方法。您只需在 /etc/ld.so.conf 文件中添加库的路径,或者更好的是,在 /etc/ld.so.conf.d/ 中添加一个包含路径的文件到您的库(如果在 /etc/ld.so.conf 中有包含指令,它将被获取,默认情况下通常是这种情况)。然后运行sudo ldconfig更新系统LD搜索路径。

    我希望这会有所帮助。干杯

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-03
      相关资源
      最近更新 更多