問(wèn)題現(xiàn)象
curl localhost:9200
curl: (48) An unknown option was passed in to libcurl
意思是執(zhí)行 curl 命令時(shí)輸入了無(wú)效參數(shù)硕糊。
yum
pycurl: libcurl link-time version is older than compile-time version
意思是正在使用的 libcurl 文件敞贡,它的軟鏈接比編譯時(shí)間還要舊留凭。按照我們的普通思維扁达,一般是先編譯好文件毡们,才能做軟連接元旬。
雖然是 2 個(gè)錯(cuò)誤惰匙,但卻是同一個(gè)原因造成的砂吞。
查找原因
定位所有 libcurl.so 文件铛铁,找到一個(gè)自己編譯的 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 可執(zhí)行文件
locate -r "/curl$" | grep bin
/apps/lib/curl-7.21.7/bin/curl
/usr/bin/curl
執(zhí)行 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 安裝的那個(gè)饵逐,但是 libcurl 用的是自己編譯的那個(gè)低版本括眠。使用的版本和編譯時(shí)的編譯信息對(duì)不上,所以就報(bào)這個(gè)錯(cuò)倍权。
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
在環(huán)境變量 PATH 和 LD_LIBRARY_PATH 找不到 /apps/lib/curl掷豺,那么 /apps/lib/curl-7.21.7/lib/libcurl.so 這個(gè)文件是怎么被 curl 優(yōu)先于 /usr/lib64/libcurl.so 找到的捞烟?
我們使用 strace 來(lái)跟蹤一下:
strace curl -V > curl.log 2>&1
使用 vim 打開(kāi)日志,打開(kāi)的同時(shí)定位關(guān)鍵字:libcurl.so
vim curl.log +/libcurl.so
發(fā)現(xiàn)是 open /etc/ld.so.cache 之后当船,接著就 open /apps/lib/curl/lib/libcurl.so.4题画。那么我們推測(cè)是從 /etc/ld.so.cache 里面讀到相關(guān)信息的:
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 是一個(gè)二進(jìn)制文件,用 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 的內(nèi)容是使用 ldconfig 命令更新的德频,更新的配置信息來(lái)自 /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 目錄苍息!找出原因了,那么解決方法就出來(lái)了壹置。
- 1竞思、直接在 /etc/ld.so.conf.d/user.conf 刪除 libcurl 配置,然后執(zhí)行 ldconfig 更新 ld.so.cache 信息钞护,需要使用的時(shí)候盖喷,使用 export LD_LIBRARY_PATH=/apps/lib/curl/lib:$LD_LIBRARY_PATH 單獨(dú)聲明
- 2、如果不需要 /apps/lib/curl难咕,直接移除 /apps/lib/curl传蹈,例如:mv /apps/lib/curl /apps/lib/curl.bak