说说利用Linux动态加载库解决服务启停出错的思路(实例示范,易懂!)

libphp5.so into server: libmcrypt.so.4: cannot open shared object file

http://t.firelen.com/linux-dongtaiku-jiazai.html

 

 

ldd 查看可执行文件使用了哪些动态库

ldconfig -p | grepjnaas 列出与jnaas相关的库文件
[root@localhost bin]#ls /etc/ld.so.conf.d/ 该目录下指定某个软件或服务编译时使用的动态链接库的路径
jnaas.conf  mysql.conf net-snmp.conf  oracle.conf  php.conf qt-x86_64.conf
ldconfig
它是一个程序,通常它位于/sbin下,是root用户使用的东东。具体作用及用法可以manldconfig查到
简单的说,它的作用就是将/etc/ld.so.conf列出的路径下的库文件缓存到/etc/ld.so.cache 以供使用
因此当安装完一些库文件,(例如刚安装好glib),或者修改ld.so.conf增加新的库路径后,需要运行一下/sbin/ldconfig
使所有的库文件都被缓存到ld.so.cache中,如果没做,即使库文件明明就在/usr/lib下的,也是不会被使用的,结果
编译过程中抱错,缺少xxx库,去查看发现明明就在那放着。。。
实战
[root@localhost ~]# /etc/init.d/httpd start
Starting httpd: httpd: Syntax error on line 3 of/opt/httpd/conf/httpd.conf: Cannot load /opt/httpd/lib/libphp5.so into server:libjnaas-2.so: cannot open shared object file: No such file or directory                                                                 [FAILED]
报错的意思为加载/opt/httpd/lib/libphp5.so这个库文件时,提示找不到libjnaas-2.so这个库文件。
解决方法
[root@localhost ~]# find /-name libjnaas-2.so      先查找一下,有可能库文件没有被缓存到ld.so.cache中 

[root@localhost ~]# ldd/opt/httpd/lib/libphp5.so
    libcrypt.so.1=> /lib64/libcrypt.so.1 (0x00002b73c3b90000)
    libz.so.1=> /usr/lib64/libz.so.1 (0x00002b73c3dc8000)
    librt.so.1=> /lib64/librt.so.1 (0x00002b73c3fdc000)
    libmysqlclient.so.16=> /opt/mysql/lib/mysql/libmysqlclient.so.16 (0x00002b73c41e6000)
    libmcrypt.so.4=> /opt/php/lib/libmcrypt.so.4 (0x00002b73c445d000)
    libgd.so.2=> /opt/php/lib/libgd.so.2 (0x00002b73c4694000)
    libfreetype.so.6=> /usr/lib64/libfreetype.so.6 (0x00002b73c48e9000)
    libX11.so.6=> /usr/lib64/libX11.so.6 (0x00002b73c4b6d000)
    libXpm.so.4=> /opt/php/lib/libXpm.so.4 (0x00002b73c4e79000)
    libpng12.so.0=> /usr/lib64/libpng12.so.0 (0x00002b73c508b000)
    libjpeg.so.62=> /usr/lib64/libjpeg.so.62 (0x00002b73c52af000)
    libresolv.so.2=> /lib64/libresolv.so.2 (0x00002b73c54d0000)
    libm.so.6=> /lib64/libm.so.6 (0x00002b73c56e6000)
    libdl.so.2=> /lib64/libdl.so.2 (0x00002b73c5969000)
    libnsl.so.1=> /lib64/libnsl.so.1 (0x00002b73c5b6d000)
    libxml2.so.2=> /usr/lib64/libxml2.so.2 (0x00002b73c5d86000)
    libclntsh.so.11.1=> /opt/oracle/product/11.2.0/dbhome/lib/libclntsh.so.11.1(0x00002b73c60c3000)
    libnetsnmp.so.25=> /opt/net-snmp/lib/libnetsnmp.so.25 (0x00002b73c86ed000)
    libcrypto.so.6=> /lib64/libcrypto.so.6 (0x00002b73c89c6000)
    libjnaas-2.so => not found
    libc.so.6=> /lib64/libc.so.6 (0x00002b73c8d17000)
    libpthread.so.0=> /lib64/libpthread.so.0 (0x00002b73c906f000)
    /lib64/ld-linux-x86-64.so.2(0x0000003797800000)
    libfontconfig.so.1=> /usr/lib64/libfontconfig.so.1 (0x00002b73c928a000)
    libXau.so.6=> /usr/lib64/libXau.so.6 (0x00002b73c94be000)
    libXdmcp.so.6=> /usr/lib64/libXdmcp.so.6 (0x00002b73c96c1000)
    libnnz11.so=> /opt/oracle/product/11.2.0/dbhome/lib/libnnz11.so (0x00002b73c98c6000)
    libaio.so.1=> /usr/lib64/libaio.so.1 (0x00002b73c9c8f000)
    libexpat.so.0=> /lib64/libexpat.so.0 (0x00002b73c9e90000)
[root@localhost ~]# cd /opt/jnaas/lib/
[root@localhost lib]# ll | grep jnaas
-rwxr-xr-x 1 root root 423190 Aug  3 09:04 libjnaas-2.2.1-12080308.so
-rwxr-xr-x 1 root root 210735 Aug  3 09:04 libjnaas-eap-2.2.1-12080308.so
lrwxrwxrwx 1 root root     30 Aug 3 09:28 libjnaas-eap.so -> libjnaas-eap-2.2.1-12080308.so
lrwxrwxrwx 1 root root     26 Aug 3 09:28 libjnaas.so -> libjnaas-2.2.1-12080308.so
-rwxr-xr-x 1 root root 84939 Aug  3 12:24rlm_jnaas-2.2.1-12080308.so
lrwxrwxrwx 1 root root     27 Aug 3 09:28 rlm_jnaas.so -> rlm_jnaas-2.2.1-12080308.so
可以看到,确实没有libjnaas-2.so这个库文件,但是有libjnaas-2.2.1-12080308.so这个库文件。可以做一个链接,指向到libjnaas-2.2.1-12080308.so
(在Linux中,一般都会做一个链接指向到某个库文件。这样做的好处是当库文件版本改变时,只要修改链接文件一直对应即可。在目录/lib、/lib64、/usr/lib、/usr/lib64 中,均可以看到这样的实例)
[root@localhost lib]# ln -s libjnaas-2.2.1-12080308.so libjnaas-2.so

再次查看 /opt/httpd/lib/libphp5.so 这个库文件的依赖库,可以看到,libjnaas-2.so 这个库文件已经正确加载了

[root@localhost lib]# ldd /opt/httpd/lib/libphp5.so
    libcrypt.so.1=> /lib64/libcrypt.so.1 (0x00002b9c8e7ac000)
    libz.so.1=> /usr/lib64/libz.so.1 (0x00002b9c8e9e4000)
    librt.so.1=> /lib64/librt.so.1 (0x00002b9c8ebf8000)
    libmysqlclient.so.16=> /opt/mysql/lib/mysql/libmysqlclient.so.16 (0x00002b9c8ee02000)
    libmcrypt.so.4=> /opt/php/lib/libmcrypt.so.4 (0x00002b9c8f079000)
    libgd.so.2=> /opt/php/lib/libgd.so.2 (0x00002b9c8f2b0000)
    libfreetype.so.6=> /usr/lib64/libfreetype.so.6 (0x00002b9c8f505000)
    libX11.so.6=> /usr/lib64/libX11.so.6 (0x00002b9c8f789000)
    libXpm.so.4=> /opt/php/lib/libXpm.so.4 (0x00002b9c8fa95000)
    libpng12.so.0=> /usr/lib64/libpng12.so.0 (0x00002b9c8fca7000)
    libjpeg.so.62=> /usr/lib64/libjpeg.so.62 (0x00002b9c8fecb000)
    libresolv.so.2=> /lib64/libresolv.so.2 (0x00002b9c900ec000)
    libm.so.6=> /lib64/libm.so.6 (0x00002b9c90302000)
    libdl.so.2=> /lib64/libdl.so.2 (0x00002b9c90585000)
    libnsl.so.1=> /lib64/libnsl.so.1 (0x00002b9c90789000)
    libxml2.so.2=> /usr/lib64/libxml2.so.2 (0x00002b9c909a2000)
    libclntsh.so.11.1=> /opt/oracle/product/11.2.0/dbhome/lib/libclntsh.so.11.1(0x00002b9c90cdf000)
    libnetsnmp.so.25=> /opt/net-snmp/lib/libnetsnmp.so.25 (0x00002b9c93309000)
    libcrypto.so.6=> /lib64/libcrypto.so.6 (0x00002b9c935e2000)
    libjnaas-2.so=> /opt/jnaas/lib/libjnaas-2.so (0x00002b9c93933000)
    libc.so.6=> /lib64/libc.so.6 (0x00002b9c93b54000)
    libpthread.so.0=> /lib64/libpthread.so.0 (0x00002b9c93eac000)
    /lib64/ld-linux-x86-64.so.2(0x0000003797800000)
    libfontconfig.so.1=> /usr/lib64/libfontconfig.so.1 (0x00002b9c940c7000)
    libXau.so.6=> /usr/lib64/libXau.so.6 (0x00002b9c942fb000)
    libXdmcp.so.6=> /usr/lib64/libXdmcp.so.6 (0x00002b9c944fe000)
    libnnz11.so=> /opt/oracle/product/11.2.0/dbhome/lib/libnnz11.so (0x00002b9c94703000)
    libaio.so.1=> /usr/lib64/libaio.so.1 (0x00002b9c94acc000)
    libexpat.so.0=> /lib64/libexpat.so.0 (0x00002b9c94ccd000)
再次启动httpd,成功。
[root@localhost lib]# /etc/init.d/httpd start
Starting httpd:                                           [  OK  ]

视觉直观感受 7 种常用的排序算法

http://blog.jobbole.com/11745/

原文出处: todayx

1. 快速排序

介绍:

快速排序是由东尼·霍尔所发展的一种排序算法。在平均状况下,排序 n 个项目要Ο(n log n)次比较。在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环(inner loop)可以在大部分的架构上很有效率地被实现出来,且在大部分真实世界的数据,可以决定设计的选择,减少所需时间的二次方项之可能性。

步骤:

  1. 从数列中挑出一个元素,称为 “基准”(pivot),
  2. 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
  3. 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

排序效果:

视觉直观感受7种常用排序算法

 

2. 归并排序

介绍:

归并排序(Merge sort,台湾译作:合并排序)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用

步骤:

  1. 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
  2. 设定两个指针,最初位置分别为两个已经排序序列的起始位置
  3. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
  4. 重复步骤3直到某一指针达到序列尾
  5. 将另一序列剩下的所有元素直接复制到合并序列尾

排序效果:

视觉直观感受7种常用排序算法

 

3. 堆排序

介绍:

堆积排序(Heapsort)是指利用这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆性质:即子结点的键值或索引总是小于(或者大于)它的父节点。

步骤:

(比较复杂,自己上网查吧)

排序效果:

视觉直观感受7种常用排序算法

 

4. 选择排序

介绍:

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小元素,然后放到排序序列末尾。以此类推,直到所有元素均排序完毕。

排序效果:

视觉直观感受7种常用排序算法

 

5. 冒泡排序

介绍:

冒泡排序(Bubble Sort,台湾译为:泡沫排序或气泡排序)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

步骤:

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

排序效果:

视觉直观感受7种常用排序算法

 

6. 插入排序

介绍:

插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。

步骤:

  1. 从第一个元素开始,该元素可以认为已经被排序
  2. 取出下一个元素,在已经排序的元素序列中从后向前扫描
  3. 如果该元素(已排序)大于新元素,将该元素移到下一位置
  4. 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
  5. 将新元素插入到该位置中
  6. 重复步骤2

排序效果:

(暂无)

 

7. 希尔排序

介绍:

希尔排序,也称递减增量排序算法,是插入排序的一种高速而稳定的改进版本。

希尔排序是基于插入排序的以下两点性质而提出改进方法的:

1、插入排序在对几乎已经排好序的数据操作时, 效率高, 即可以达到线性排序的效率

2、但插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位>

排序效果:

视觉直观感受7种常用排序算法