在日常的维护中,免不了和文件打交道,文件涉及的问题有很多类,这里讨论: 文件丢失,损坏,兼容性问题。 而对于文件丢失导致的问题一般比较容易定位,而文件损坏,特别是兼容性问题,这类排查起来就比较繁琐. 本文提供一种解决思路,望能起到抛砖引玉的作用.
[root@www ~]# curl 127.0.0.1
curl: (2) Failed initialization
[root@www ~]#
[root@www lib64]# strace -f -e open curl 127.0.0.1 2>&1 | grep -Ei "No such file or directory" | awk -F'[()]' '{print $2}' | awk -F, '{print $1}' | tr -d "\"" | xargs -I{} basename {} | uniq
libcurl.so.4
libssl3.so
libsmime3.so
libnss3.so
libnssutil3.so
libplds4.so
libplc4.so
libnspr4.so
libpthread.so.0
libdl.so.2
libz.so.1
libc.so.6
libidn.so.11
libldap-2.4.so.2
librt.so.1
libgssapi_krb5.so.2
libkrb5.so.3
libk5crypto.so.3
libcom_err.so.2
libssh2.so.1
liblber-2.4.so.2
libresolv.so.2
libsasl2.so.3
libssl.so.10
libcrypto.so.10
libkrb5support.so.0
libkeyutils.so.1
libcrypt.so.1
libselinux.so.1
libfreebl3.so
libpcre.so.1
legacy-settings
.curlrc
[root@www lib64]# strace -f -e open curl 127.0.0.1 2>&1 | grep -Ei "No such file or directory" | awk -F'[()]' '{print $2}' | awk -F, '{print $1}' | tr -d "\"" | xargs -I{} basename {} | uniq | wc -l
33
然后 用strace 查看成功打开的文件列表:
[root@www lib64]# strace -f -e open curl 127.0.0.1 2>&1 | grep -Evi "= \-1" | awk -F'["]' '{print $2}' | xargs -I{} basename {}
ld.so.cache
libcurl.so.4
libssl3.so
libsmime3.so
libnss3.so
libnssutil3.so
libplds4.so
libplc4.so
libnspr4.so
libpthread.so.0
libdl.so.2
libz.so.1
libc.so.6
libidn.so.11
libldap-2.4.so.2
librt.so.1
libgssapi_krb5.so.2
libkrb5.so.3
libk5crypto.so.3
libcom_err.so.2
libssh2.so.1
liblber-2.4.so.2
libresolv.so.2
libsasl2.so.3
libssl.so.10
libcrypto.so.10
libkrb5support.so.0
libkeyutils.so.1
libcrypt.so.1
libselinux.so.1
libfreebl3.so
libpcre.so.1
filesystems
locale-archive
[root@www lib64]# strace -f -e open curl 127.0.0.1 2>&1 | grep -Evi "= \-1" | awk -F'["]' '{print $2}' | xargs -I{} basename {} | uniq | wc -l
34
最后,比较两个文件(grep -Ff 命令实现),发现真正没有找到的文件只有:.curlrc,而这个文件并不会导致curl出错,因为它属于curl的配置文件, man curl 有如下的解释:
FILES
~/.curlrc
Default config file, see -K, --config for details.
[root@www lib64]# ldd `which curl`
linux-vdso.so.1 => (0x00007ffe77150000)
libcurl.so.4 => /lib64/libcurl.so.4 (0x00007fbd9c354000)
libssl3.so => /lib64/libssl3.so (0x00007fbd9c102000)
libsmime3.so => /lib64/libsmime3.so (0x00007fbd9bedb000)
libnss3.so => /lib64/libnss3.so (0x00007fbd9bbae000)
libnssutil3.so => /lib64/libnssutil3.so (0x00007fbd9b97e000)
libplds4.so => /lib64/libplds4.so (0x00007fbd9b77a000)
libplc4.so => /lib64/libplc4.so (0x00007fbd9b575000)
libnspr4.so => /lib64/libnspr4.so (0x00007fbd9b337000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fbd9b11b000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fbd9af17000)
libz.so.1 => /lib64/libz.so.1 (0x00007fbd9ad01000)
libc.so.6 => /lib64/libc.so.6 (0x00007fbd9a934000)
libidn.so.11 => /lib64/libidn.so.11 (0x00007fbd9a701000)
libldap-2.4.so.2 => /lib64/libldap-2.4.so.2 (0x00007fbd9a4ac000)
librt.so.1 => /lib64/librt.so.1 (0x00007fbd9a2a4000)
libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007fbd9a057000)
libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007fbd99d6e000)
libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007fbd99b3b000)
libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007fbd99937000)
libssh2.so.1 => /lib64/libssh2.so.1 (0x00007fbd9970d000)
/lib64/ld-linux-x86-64.so.2 (0x00007fbd9c5a9000)
liblber-2.4.so.2 => /lib64/liblber-2.4.so.2 (0x00007fbd994fe000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007fbd992e5000)
libsasl2.so.3 => /lib64/libsasl2.so.3 (0x00007fbd990c8000)
libssl.so.10 => /lib64/libssl.so.10 (0x00007fbd98e56000)
libcrypto.so.10 => /lib64/libcrypto.so.10 (0x00007fbd989f4000)
libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007fbd987e4000)
libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007fbd985e0000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007fbd983a9000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007fbd98182000)
libfreebl3.so => /lib64/libfreebl3.so (0x00007fbd97f7f000)
libpcre.so.1 => /lib64/libpcre.so.1 (0x00007fbd97d1d000)
[root@www lib64]# curl -i 127.0.0.1
curl: (2) Failed initialization
[root@www lib64]#
通过strings 命令查看对应的动态链接库文件的报错信息,通过比对,最终发现有且只有 /lib64/libcurl.so.4 这个文件有 "Failed initialization" 这个报错信息,然后进一步发现该文件所属的rpm包为rhel6发行版的,而当前的os是centos7. 所以替换掉这个旧包,然后问题顺利解决;
本文原创,转载请著名出处