在使用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命令,查看该动态库依赖的其他动态库文件。然后就可以发现问题所在了。
谢谢大佬!!