jenkins执行过程中,找不到指定的符号,报错退出的解决办法

在使用jenkins执行job过程中,遇到了如下错误。造成脚本不能正常运行:

symbol lookup error: /lib64/libncurses.so.5: undefined symbol: _nc_putchar

但是,如果自己ssh到该job执行的服务器上,手动执行命令,是正常的。

查阅了很多资料,都没有找到解决办法。

无奈之下,在jenkins上,建了一个job,去执行 ldd /libt64/libncurses.so.5 命令,看看依赖的动态库信息。

一执行,就发现了问题所在:

+ ldd /lib64/libncurses.so.5

    linux-vdso.so.1 =>  (0x00007ffe014eb000)

    libc.so.6 => /lib64/libc.so.6 (0x00007f7bf7766000)

    libdl.so.2 => /lib64/libdl.so.2 (0x00007f7bf7562000)

    libtinfo.so.5 => /home/share/tools/edatools/synopsys/verdi/Q-2020.03-SP1-1/etc/lib/libstdc++/LINUXAMD64/libtinfo.so.5 (0x00007f7bf7338000)

    /lib64/ld-linux-x86-64.so.2 (0x00007f7bf7d5b000)

发现依赖的libtinfo.so.5动态库文件,竟然不是系统目录下的。

ssh到该服务器,执行ldd命令,得到以下信息:

ldd /lib64/libncurses.so.5

    linux-vdso.so.1 =>  (0x00007ffddd962000)

    libc.so.6 => /lib64/libc.so.6 (0x00007f6b11205000)

    libdl.so.2 => /lib64/libdl.so.2 (0x00007f6b11001000)

    libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00007f6b10dd7000)

    /lib64/ld-linux-x86-64.so.2 (0x00007f6b117fa000)

依赖的libtinfo.so.5文件,是系统目录下的。

所以,这样就找到了该问题原因。

下面就追究下,为什么jenkins依赖的动态库文件,是在那个神奇的目录下,而不是系统库的目录下。

查看node的system information。

在 java.library.path变量中,找到了问题所在:

java.library.path

/home/share/tools/edatools/synopsys/verdi/Q-2020.03-SP1-1/platform/LINUXAMD64/bin:/home/share/tools/edatools/synopsys/verdi/Q-2020.03-SP1-1/platform/LINUXAMD64/lib/Qt:/home/share/tools/edatools/synopsys/verdi/Q-2020.03-SP1-1/platform/LINUXAMD64/lib/tbb:/home/share/tools/edatools/synopsys/verdi/Q-2020.03-SP1-1/etc/lib/libstdc++/LINUXAMD64:/home/share/tools/edatools/synopsys/verdi/Q-2020.03-SP1-1/share/NPI/lib/LINUXAMD64:/home/share/tools/edatools/synopsys/verdi/Q-2020.03-SP1-1/share/NPI/lib/LINUX64:/home/share/tools/edatools/synopsys/verdi/Q-2020.03-SP1-1/share/PLI/lib/LINUX64:/home/share/tools/python/python3.7.3/lib:/home/share/tools/usr/lib64:/usr/java/packages/lib/amd64:/usr/lib64:/lib64:/lib:/usr/lib

因为将神奇的目录,加载到了library的搜索路径中。所以,就优先搜索该神奇目录下的动态库文件。

原来,jenkins在创建node的时候,会到该node服务器上,使用java命令,启动java进程,用来和jenkins通信。而使用的java命令,就在那神奇的目录下,所以该目录下的java,就自动把一些他依赖的目录给加载到了library的搜索路径中,造成了jenkins执行的时候,会出现一些symbol找不到。

总结:

当jenkins遇到动态库文件找不到symbol,首先创建一个job,使用ldd命令,查看该动态库依赖的其他动态库文件。然后就可以发现问题所在了。

 

此条目发表在持续集成分类目录。将固定链接加入收藏夹。

发表评论

电子邮件地址不会被公开。