问题现象
curl localhost:9200
curl: (48) An unknown option was passed in to libcurl
意思是执行 curl 命令时输入了无效参数。
yum
pycurl: libcurl link-time version is older than compile-time version
意思是正在使用的 libcurl 文件,它的软链接比编译时间还要旧。按照我们的普通思维,一般是先编译好文件,才能做软连接。
虽然是 2 个错误,但却是同一个原因造成的。
查找原因
定位所有 libcurl.so 文件,找到一个自己编译的 curl-7.21.7,版本比 yum 安装的 7.29.0 低:
locate -r "/libcurl.so$"
/apps/lib/curl-7.21.7/lib/libcurl.so
/usr/lib64/libcurl.so
定位所有 curl 可执行文件
locate -r "/curl$" | grep bin
/apps/lib/curl-7.21.7/bin/curl
/usr/bin/curl
执行 curl 命令查看 libcurl 版本
sudo curl --version | grep --color libcurl
curl 7.29.0 (x86_64-redhat-linux-gnu) libcurl/7.21.7 OpenSSL/1.0.0r zlib/1.2.7
可以看到,curl 版本是 yum 安装的那个,但是 libcurl 用的是自己编译的那个低版本。使用的版本和编译时的编译信息对不上,所以就报这个错。
curl -V | grep libcurl
curl 7.29.0 (x86_64-redhat-linux-gnu) libcurl/7.29.0 NSS/3.21 Basic ECC zlib/1.2.7 libidn/1.28 libssh2/1.4.3
在环境变量 PATH 和 LD_LIBRARY_PATH 找不到 /apps/lib/curl,那么 /apps/lib/curl-7.21.7/lib/libcurl.so 这个文件是怎么被 curl 优先于 /usr/lib64/libcurl.so 找到的?
我们使用 strace 来跟踪一下:
strace curl -V > curl.log 2>&1
使用 vim 打开日志,打开的同时定位关键字:libcurl.so
vim curl.log +/libcurl.so
发现是 open /etc/ld.so.cache 之后,接着就 open /apps/lib/curl/lib/libcurl.so.4。那么我们推测是从 /etc/ld.so.cache 里面读到相关信息的:
execve("/usr/bin/curl", ["curl", "-V"], [/* 24 vars */]) = 0
brk(0) = 0x1164000
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f5676b08000
access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
fstat(3, {st_mode=S_IFREG|0644, st_size=41067, ...}) = 0
mmap(NULL, 41067, PROT_READ, MAP_PRIVATE, 3, 0) = 0x7f5676afd000
close(3) = 0
open("/apps/lib/curl/lib/libcurl.so.4", O_RDONLY|O_CLOEXEC) = 3
/etc/ld.so.cache 是一个二进制文件,用 strings 命令可以看到 /apps/lib/curl/lib/libcurl.so.4 的确在 /usr/lib64/libcurl.so 前面:
strings /etc/ld.so.cache | grep "/libcurl.so$"
/apps/lib/curl/lib/libcurl.so
/lib64/libcurl.so
ld.so.cache 的内容是使用 ldconfig 命令更新的,更新的配置信息来自 /etc/ld.so.conf:
cat /etc/ld.so.conf
include ld.so.conf.d/*.conf
grep 搜索下 curl
grep -ir curl /etc/ld.so.conf.d/
/etc/ld.so.conf.d/user.conf:/apps/lib/curl/lib
这里配置了自己编译的 curl 目录!找出原因了,那么解决方法就出来了。
- 1、直接在 /etc/ld.so.conf.d/user.conf 删除 libcurl 配置,然后执行 ldconfig 更新 ld.so.cache 信息,需要使用的时候,使用 export LD_LIBRARY_PATH=/apps/lib/curl/lib:$LD_LIBRARY_PATH 单独声明
- 2、如果不需要 /apps/lib/curl,直接移除 /apps/lib/curl,例如:mv /apps/lib/curl /apps/lib/curl.bak
网友评论