背景:我很喜欢在命令行调试API,返回数据都是JSON格式的。打印出来的内容太痛苦了,如:{"status":200,"data":[{"id":1000,"name":"John"}{"id":1004,"name":"Tom"}]},有木有工具打印个易读的样式,这样的


实践一:
答:可以使用python的json.tool!
cat json|python -mjson.tool

cat json|python -mjson.tool
python: module json.tool not found
json是python3内置模块,在包libpython3.3-stdlib中提供。
centOS的默认的python版本是V2.4.3,但运行json库也好需要的版本是3以上,linux(CentOS)下升级python3.3:
http://lovebeyond.iteye.com/blog/1770476 ,后面升级后就Ok了,自带这个包,相当靠谱~  AddTime:2015-03-09


echo '{"status":200,"data":[{"id":1000,"name":"John"},{"id":1004,"name":"Tom"}]}'|python -mjson.tool
Vim中格式化json数据:
命令模式下
#!python -m json.tool
可以映射快捷键,如Ctrl+F6,编辑vimrc:

“ Format JSON data using python module json.tool
map <C-F6> :#!python -m json.tool<CR>

vim调用python格式化json数据:


实践二,根据1接合windows使用curl命令输出json并格式化的方法:
windows中使用curl命令需要下载curl工具

下载地址:http://curl.haxx.se/download.html

请选择不带SSL的版本,否则还需要安装SSL的支持包

我下载的版本 http://www.paehl.com/open_source/?CURL_7.28.1
下载后解压,将exe文件拷贝到 C:\windows\system32目录下即可在cmd中直接调用

我使用linux下成功的相同命令去发现报错如下:



网上查发现是引号的原因,

例如linux下成功命令格式如下:

来自:http://blog.csdn.net/lipei1220/article/details/8536520
http://blog.longwin.com.tw/2012/12/cli-python-json-formatter-2012/
http://blog.csdn.net/yuechuzhao/article/details/24460781
http://openwares.net/linux/vim_call_python_format_json.html







————————————————————linux(CentOS)下升级python3.3———————————————————————————
CentOS下的Python版本一般都比较低,很多应用都需要升级python来完成。我装的centOS的默认的python版本是V2.4.3,但运行node.js需要的版本是2.5以上。

1。下载python3.3安装包:wget http://www.python.org/ftp/python/3.3.0/Python-3.3.0.tgz

2。解压安装包:tar -zxvf Python-3.3.0.tgz
  

3。进入解压后目录:cd Python-3.3.0


4。创建安装目录:mkdir /usr/local/python3.3
  

5。编译安装:./configure --prefix=/usr/local/python3.3

6。执行:make && make install

7。此时已完成新版本的安装,但由于老版本还在系统中,所以需要将原来/usr/bin/python链接改为新的连接:a.先修改老的连接,执行:mv /usr/bin/python /usr/bin/python_bak。b.再建立新连接: ln -s /usr/local/python3.3/bin/python3.3 /usr/bin/python

8。查询python版本,执行:python

显示如下:
Python 3.3.0 (default, Jan 16 2013, 17:52:44)
[GCC 4.1.2 20071124 (Red Hat 4.1.2-42)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>
已安装成功了。恭喜你。

实际情况,一堆老版本,还得都给挪动一下,否则还是2.7啥的:
/usr/bin/python2.4
mv /usr/bin/python2.4  /usr/bin/python2.4_bak
ln -s /usr/local/python3.3/bin/python3.3 /usr/bin/python2.4

/usr/local/bin/python2.7
mv /usr/local/bin/python2.7 /usr/local/bin/python2.7_bak
ln -s /usr/local/python3.3/bin/python3.3 /usr/local/bin/python2.7

实践来源:http://lovebeyond.iteye.com/blog/1770476


最后,json显示结构化Ok了:
[root@test Python-3.3.0]# echo '{"status":200,"data":[{"id":1000,"name":"John"},{"id":1004,"name":"Tom"}]}'|python -mjson.tool
{
    "data": [
        {
            "id": 1000,
            "name": "John"
        },
        {
            "id": 1004,
            "name": "Tom"
        }
    ],
    "status": 200
}

再结合Curl这个命令行显示一把,实践如下:
cat json.php

shell访问,直接访问json是一行,后面直接加上python的解析后变成了一个格式化的json串显示出来了,达到了目的,如下:
[root@test tools.jackxiang.com]# curl -H"Host:t43.jackxiang.com" "http://192.168.109.8/json.php"
    {  "status":200,  "data":  [  {  "id":1000,  "name":"John"  },  {  "id":1004,  "name":"Tom"  }  ]  }  [root@test tools.jackxiang.com]# curl -H"Host:t43.jackxiang.com" "http://192.168.109.8/json.php"                            vi json.php
[root@test tools.jackxiang.com]# curl -H"Host:t43.jackxiang.com" "http://192.168.109.8/json.php" | python -mjson.tool  
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   106    0   106    0     0  51381      0 --:--:-- --:--:-- --:--:--     0
{
    "data": [
        {
            "id": 1000,
            "name": "John"
        },
        {
            "id": 1004,
            "name": "Tom"
        }
    ],
    "status": 200
}


最后,当python升级到3后,yum出现:except KeyboardInterrupt, e:
问题:
——————————————————————————————————
[root@name user]# yum
File "/usr/bin/yum", line 30
except KeyboardInterrupt, e:
^
原因:
这是因为yum采用python作为命令解释器,这可以从/usr/bin/yum文件中第一行#!/usr/bin/python发现。而python版本之间兼容性不太好,使得2.X版本与3.0版本之间存在语法不一致问题。而CentOS 5自带的yum采用的是python2.4,当系统将python升级到2.6或3.0后,出现语法解释错误。
解决办法:
很简单,一是升级yum,一是修改yum的解释器为旧版本python2.4(如果你没有采用覆盖升级的话)
升级yum的作法就不详述了;
修改yum的解释器为旧版本python2.4:
     vi /usr/bin/yum

     将第一行"#!/usr/bin/python" 改为 "#!/usr/bin/python2.4"即可,我自己是修改:
      /usr/bin/python2.4_bak  //前面挪动到这儿了,实践是OK的~

摘自:http://blog.sina.com.cn/s/blog_67d6a2650100jiaw.html
背景:做日志分析,linux C 的开发环境,在对每行日志进行处理的时候,手下一个小伙用的是逐字节拆分成字段(也就是指针)。刚开始没注意,后来每天10几G的日志上来后,发现除了速度特别慢以外,还经常出问题,遇到错误格式的日志就直接崩溃。。。从文件读取数据是一件很麻烦的事,所幸有sscanf()函数,对网络输入数据也就是从一个字符串中读进与指定格式相符的数据并进行分组也是可行的。

在做一道九度上机题时,突然发现sscanf()函数非常有用,就顺便从网上搜集资料整理一下。
       sscanf() 的作用:从一个字符串中读进与指定格式相符的数据.
原型: int sscanf (const char *str,const char * format,........);
说明: sscanf()会将参数str的字符串根据参数format字符串来转换并格式化数据。转换后的结果存于对应的参数内。
         成功则返回参数数目,失败则返回0。
注意:sscanf与scanf类似,都是用于输入的,只是后者以键盘(stdin)为输入源,前者以固定字符串为输入源。
大家都知道sscanf是一个很好用的函数,利用它可以从字符串中取出整数、浮点数和字符串等等。它的使用方法简单,特别对于整数和浮点数来说。
这里就举几个经常用到的例子来说明他的用法,便于大家深刻理解他的用法.



[root@test sscanf]# gcc sscanf.c
[root@test sscanf]# ./a.out
用法一
str = 1234
用法二
time = 2013-2-13 14:55:34
用法三
str = 12345
用法四
str = acc
用法五
str = 12345
用法六
str = 12345+


同进,我想把http请求里的get的串取出来,怎么办?

编译运行调试:
[root@test sscanf]# gcc sscanf.c      
[root@test sscanf]# ./a.out
用法七
str = task


来自:http://blog.csdn.net/sjf0115/article/details/8579935
开始前我要先做个澄清:这篇文章同Linus Torvalds这种死忠C程序员吐槽C++的观点是不同的。在我的整个职业生涯里我都在使用C++,而且现在C++依然是我做大多数项目时的首选编程语言。自然的,当我从2007年开始做ZeroMQ(ZeroMQ项目主页)时,我选择用C++来实现。主要的原因有以下几点:

1.  包含数据结构和算法的库(STL)已经成为这个语言的一部分了。如果用C,我将要么依赖第三方库要么不得不自己手动写一些自1970年来就早已存在的基础算法。

2.  C++语言本身在编码风格的一致性上起到了一些强制作用。比如,有了隐式的this指针参数,这就不允许通过各种不同的方式将指向对象的指针做转换,而那种做法在C项目中常常见到(通过各种类型转换)。同样的还有可以显式的将成员变量定义为私有的,以及许多其他的语言特性。

3.  这个观点基本上是前一个的子集,但值得我在这里显式的指出:用C语言实现虚函数机制比较复杂,而且对于每个类来说会有些许的不同,这使得对代码的理解和维护都会成为痛苦之源。

4.  最后一点是:人人都喜欢析构函数,它能在变量离开其作用域时自动得到调用。阅读全文
背景:对于文件块验证,或字符串的传输是否在网络中修改过,这儿有各种方法,MD5、SHA1、CRC32这三个用于检测文件是否被修改过,哪个可靠性最高?我看特别是分片上传这块,有的是md5,有的是sha1,有的是crc的验证,如优酷(是crc的)、百度云、126的邮箱大附件上传等都有这么一个环节~于是,在网上找相关文章了解一下其不同及性能上的差别。

MD5 和SHA1的基本原理都是一样的,都是将一个文件按照一定的算法计算后得到一个固定位数的数据,这个数据就是这个文件的(MD5,SHA1)值。而且这个值是唯一的,也就是说只有这个文件经过计算后能够得到这个值,里面哪怕有一个标点的改动所计算的值的差别都会很大。只需要在本地再进行一次MD5,SHA1的计算和原值比较即可知道源文件是否完整。CRC校验通常是将CRC的校验码放在数据文件的后面一同发送给接受方,接收方再次通过计算来判定数据的完整性。
目前如果用于加密领域,SHA的安全性能最高。如果你的可靠性是指文件的完整性,那么个人觉得MD5和SHA1要比CRC32好一些。
————————————————————————————————————————————————————————————————————————————
一、MD5与SHA算法
    Hash函数又称杂凑函数,用于摘要算法,它是将不定长的明文信息经过复杂的运算得到一个定长的数值,这就是“签名”。摘要算法与一般的对称或非对称加密算法不同,它并不用于防止信息被窃取,而是用于证明原文的完整性和准确性,也就是说,数字签名主要是用于防止信息被篡改。

由于Hash函数产生定长的数字签名,其结果是个有限的集合,而待签名的明文信息可以是计算机网络上传输的任意信息,也就是说,明文信息是一个无限集合,两个集合之间其实无法构成一一对应的关系,总会有多个明文信息产生相同的数字签名的情况发生,这就是所谓的“碰撞”。不过Hash函数的可靠性在概率上仍可以算法的健壮性来保证,数字签名类似指纹,只要选择足够全的算法,产生碰撞的概率就会足够小,可令现代最先进的计算设备也找不出“碰撞”,这样算法就不会被破解了。

     MD5(RFC1321)诞生于1991年,全称是“Message-Digest Algorithm信息摘要算法)5”,由MIT的计算机安全实验室和RSA安全公司共同提出,之前已经有MD2、MD3和MD4几种算法。MD5克服了MD4的缺陷,生成128bit的摘要信息串,出现之后迅速成为主流算法,并在1992年被收录到RFC中。

MD5算法是1991年发布的一项数字签名加密算法,它当时解决了MD4算法的安全性缺陷,成为应用非常广泛的一种算法。作为Hash函数的一个应用实例。

SHA诞生于1993年,全称是安全散列算法(Secure Hash Algorithm),由美国国家安全局(NSA)设计,之后被美国标准与技术研究院(NIST)收录到美国的联邦信息处理标准(FIPS)中,成为美国国家标准,SHA(后来被称作SHA-0)于1995被SHA-1(RFC3174)替代。SHA-1生成长度为160bit的摘要信息串,虽然之后又出现了SHA-224、SHA-256、SHA-384和SHA-512等被统称为“SHA-2”的系列算法,但仍以SHA-1为主流。

SHA-1的应用范围或许比MD5更加广泛,其安全性较MD5要高出很多。SHA-1是美国国家标准技术研究院(NIST)与美国国家安全局(NSA)共同设计的,一些重要的场合都选择SHA-1来做数字签名。美国政府更是早在1994年就开始采用了SHA-1算法。

MD5和SHA-1是当前应用最为广泛的两种散列算法。常见的Unix系统口令以及多数论坛/社区系统的口令都是经MD5处理后保存其摘要信息串,在互联网上,很多文件在开放下载的同时都提供一个MD5的信息摘要,使下载方(通过MD5摘要计算)能够确认所下载的文件与原文件一致,以此来防止文件被篡改。

    MD5和SHA-1还常被用来与公钥技术结合来创建数字签名。当前几乎所有主要的信息安全协议中都使用了SHA-1或MD5,包括SSL(HTTPS就是SSL的一种应用)、TLS、PGP、SSH、S/MIME和IPSec,因此可以说SHA-1和MD5是当前信息安全的重要基础之一。

    不过,从技术上讲,MD5和SHA-1的碰撞可在短时间内被求解出并不意味着两种算法完全失效。例如,对于公文的数字签名来说,寻找到碰撞与寻找到有特定含义的碰撞之间仍有很大的差距,而后者才会使伪造数字公文成为现实。但无论如何,王小云教授所掌握的方法已经为短时间内寻找到MD5或SHA-1的碰撞成为可能,这足以使经过MD5或SHA-1处理的数字签名再也难以成为法律认可的依据。

MD5和SHA-1就曾经被认为是足够安全的Hash算法。虽然早在1994年就有研究报告指出,如果用运算能力最强的机器,平均用24天就可能找到一个MD5的碰撞,但这个方法的效率和成本在现实中并不具备实际的意义。王小云在接受本报记者独家采访时透露,她独创的“模差分”算法可以用一般性能的计算机在两个小时内就找到MD5的碰撞,已经为实际应用提供了可能。

来自:http://blog.csdn.net/liyangbing315/article/details/5682107

二、微软出品:MD5和SHA1值验证命令行工具
基本使用方法:
fciv.exe  myfilm.iso  -wp -md5 -xml mydb.xml
该命令可以计算myfilm.iso的md5值,并且保存到mydb.xml当中,同时会保存该文件的名称,-wp的作用是去掉文件的路径信息仅仅保存文件名

fciv.exe -list -md5 -xml mydb.xml
打印mydb.xml当中的md5值以及相应的文件名称,它的显示格式也比较特别,首先打印md5值,随后是文件名称

fciv.exe d:\mymusic\   -tpye *.mp3 -wp -md5 -xml mymusic.xml
计算d盘mymusic文件夹下面,所有以MP3结尾的文件的md5值并且保存到mymusic.xml当中

由于这是一个命令行工具,因此可以批处理的方式,大量自动化计算各种md5值。

工具下载地址和基本的使用方法介绍见下面的链接
http://support.microsoft.com/kb/841290
DownLoad Url:http://download.microsoft.com/download/c/f/4/cf454ae0-a4bb-4123-8333-a1b6737712f7/Windows-KB841290-x86-ENU.exe

摘自:http://blog.chinaunix.net/uid-20385936-id-3841729.html

三、PHP md5 vs sha1 性能测试
先上代码:

Win7 PHP 5.3.5 cli 下连续三次的输出
D:\test>php md5-vs-sha1.php
0.36025786399841
0.47072792053223

D:\test>php md5-vs-sha1.php
0.36374092102051
0.47682809829712

D:\test>php md5-vs-sha1.php
0.37186717987061
0.55312395095825
Ubuntu Server 11.04 PHP 5.3.5 cli 下的连续三次的输出
  
$ php md5-vs-sha1.php
0.4476261138916
0.45379900932312

$ php md5-vs-sha1.php
0.43760395050049
0.45441389083862

$ php md5-vs-sha1.php
0.44000005722046
0.53387594223022
由此可见,md5 会比 sha1 稍微快一点点,两者都不会造成性能问题。
From:http://my.oschina.net/heiing/blog/122914
背景:用新版本的编译器编译时,原来没有报任何错和警告的代码,现在居然报出警告了,
之前是:

无错误,现在是新的gcc v4.4的编译器编译时候出现警告了,如下:


警告如下:
multipepollserver.cpp:530: warning: deprecated conversion from string constant to ‘char*’
multipepollserver.cpp:536: warning: deprecated conversion from string constant to ‘char*’
multipepollserver.cpp:537: warning: deprecated conversion from string constant to ‘char*’

原来是定义pid变量时,新的gcc版本需要加上const,也就是:

为何要加,下面文章有描写道:
阅读全文
该软件是Mac下非常方便的Web调试工具与windows下的Fiddler一样,用过Fiddler的人应该都知道其功能对于web开发来说是多棒。 如果你不知道Fiddler可以看这里http://blog.thinkjs.net/archives/79

From:http://download.csdn.net/download/chuandeng99/4505164
一、记录CentOS 7与以往不同的地方
由于公司这一期的产品准备支持的环境有CentOS 7、MySql 5.6、Java 8、Tomcat 8等等,并且因为人员严重不足,我本月的开发任务在原有的基础上又加上了好多环境检证的工作。
  因为在这次环境检证过程中遇到了不少困难,特此记录一下。
  重点:记录CentOS 7与以往不同的地方
  1.取消ifconfig,使用ip addr 查看IP地址。  
  2.使用firewalld 取代 iptables。
  3.系统默认编码设置文件,由/etc/sysconfig/i18n  更改为 /etc/locale.conf
___________________________详细介绍使用感受__________________________
因为系统安装时网络连接设置的自动获取,先改成静态ip。配置方法如下:
  第一步,vi /etc/sysconfig/network-scripts/ifcfg-enp0s25;
  设置内容:
  
  解释:  
IPADDR0 --> ip
GATEWAY0 --> 网关
DNS1 -->DNS
  
  第二步,重启网络服务 -->service network restart(特别重要,千万不要忘记。)
  第三步.查看ip ip addr,再 ping 一下网络。这是网络配置基本就完成了。
  事情进展到这里貌似也没什么难过的坎,我开始配置防火墙。先使用 iptables status 查看防火墙状态,
  
  我去,什么鬼?我敲错了?有一次仔细核对了每一个字母,完全没错啊!!!不管怎么说,先看一下iptables脚本是否还存在吧。
  
  咦,iptables脚本不见了。不用多想一定是CentOS 7使用了新型的防火墙,立即百度。
  ※度娘解惑:CentOS 7使用firewalld 取代 iptables。使用命令行工具firewalld-cmd获取firewalld状态,$ firwall-cmd --state。
摘自:http://www.linuxidc.com/Linux/2015-01/111998.htm

————————————————————————————————————————————————————————————
二、修改开机启动顺序:
http://wenku.baidu.com/link?url=HXBiVyBOB_p1oAEN0Wunreof9Fff9dy4s6abRC_Zqq6Cm1ZbOvmgXrcQ3kC3OTLmDq-FwrjeK-Fw9zgoZ3yBGGyA_ikGSRtjvhjcS_dEaQu

————————————————————————————————————————————————————————————
三、 CentOS 7 巨大变动之 systemd 取代 SysV的Init
systemd是什么
首先systmed是一个用户空间的程序,属于应用程序,不属于Linux内核范畴,Linux内核的主要特征在所有发行版中是统一的,厂商可以自由改变的是用户空间的应用程序。
Linux内核加载启动后,用户空间的第一个进程就是初始化进程,这个程序的物理文件约定位于/sbin/init,当然也可以通过传递内核参数来让内核启动指定的程序。这个进程的特点是进程号为1,代表第一个运行的用户空间进程。不同发行版采用了不同的启动程序,主要有以下几种主流选择:
(1)以Ubuntu为代表的Linux发行版采用upstart。
(2)以7.0版本之前的CentOS为代表的System V init。
(3)CentOS7.0版本的systemd。
下面是CentOS6.5和CentOS7两个版本初始化进程的信息截图。
CentOS6.5采用的是systemV init
CentOS7 采用的是systemd:
Linux内核加载启动后,用户空间的第一个进程就是初始化进程,这个程序的物理文件约定位于/sbin/init,当然也可以通过传递内核参数来让内核启动指定的程序。这个进程的特点是进程号为1,代表第一个运行的用户空间进程。不同发行版采用了不同的启动程序,主要有以下几种主流选择:
(1)以Ubuntu为代表的Linux发行版采用upstart。
(2)以7.0版本之前的CentOS为代表的System V init。
(3)CentOS7.0版本的systemd。
下面是CentOS6.5和CentOS7两个版本初始化进程的信息截图。
CentOS6.5采用的是systemV init
CentOS7 采用的是systemd

摘自:http://blog.csdn.net/smstong/article/details/39317491

参考:https://blog.linuxeye.com/400.html
背景:多进程时用管道进行子进程间或子进程于线程之间通讯,出现父进程已经双close后还是出现了当有请求来时,子进程写入处理线程时管道阻塞住了,怎么办,管道调试试试看了,学习备忘下。

1)管道的调试
阅读全文
问题:
这个是一个进程,并且21263是21326的父进程,如果我知道某个子进程的ID号,如何找到他的父进程是哪个?
prod 21326 21263   0 02:04:41 ?           0:00 /p05/product/oracle10g/iAS/bin/httpd -d /p05/
最好是用:ps -ef --forest
-l,l long          u  user-oriented   --sort --tty --forest --version

\_ sshd: xiangdong [priv]
|   \_ sshd: xiangdong@pts/7,pts/17,pts/10,pts/14,pts/15
|       \_ -bash
|       |   \_ su -
|       |       \_ -bash
|       \_ -bash
|       |   \_ su -
|       |       \_ -bash
|       \_ -bash
|       |   \_ su -
|       |       \_ -bash
|       |           \_ ps aux --forest
|       \_ -bash
|       |   \_ su -
|       |       \_ -bash
|       \_ -bash
|           \_ su -
|               \_ -bash
|                   \_ [httpmut: master process] H?????5?"


如nginx和php-fpm:
root     32550     1  0  2014 ?        00:00:00 nginx: master process ../sbin/nginx
www        730 32550  0 Jan26 ?        00:00:01  \_ nginx: worker process
www        731 32550  0 Jan26 ?        00:00:00  \_ nginx: worker process
www        732 32550  0 Jan26 ?        00:00:01  \_ nginx: worker process

root      6482     1  0  2014 ?        00:00:00 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)              
www       6483  6482  0  2014 ?        00:05:20  \_ php-fpm: pool www                                                      
www       6484  6482  0  2014 ?        00:05:26  \_ php-fpm: pool www                                                      
和ps aux|grep nginx一样的结果。

——————————————————————————————————————————————————

方法一:
lsof好像可以:


方法二:
ps -ef|awk '$2 ~ /pid/{print $2}'
pid :子进程ID
ps -ef|awk '$2 ~ /10555/{print $2}'

方法三:
ps -ef --forest
www      10555     1  0 15:08 pts/6    00:00:00 [httpmut: worker process] H????

摘处:http://bbs.chinaunix.net/thread-1810739-1-1.html
背景:sqllite这个小小的sql数据库,性能不错,尤其在Linux上的一些散型业务,完全可以用它,小巧、高效、无端口、单文件。
     最新发布的SQLite 3.8.7 alpha版(下载页面http://www.sqlite.org/download.html)比16个月前发布的3.7.17版快50%。这也就是说,在相同数量的CPU指令周期里,最新版的SQLite能多做50%的工作。

性能提升的幅度要比我们进行改进时预想的结果漂亮的多。我们在不断的寻找新的方法来执行查询语句操作,并把优秀的方法新增到查询引擎中。比如,在前一版中,我用新的方法改进了IN操作,新方法要比老方法速度快5倍,这个消息我们曾在邮件列表里公布过。

这50%的提升,并不是我们有了更好的查询策略。这50%是指我们在磁盘上移动字节的速度和b-trees搜索效率。我们进行成百上千的微优化后才获得了这样的成果。这每个微优化都能让性能提升一点,比如0.05%。如果我们能一次提升0.25%,这将被认为是一次巨大的成功。所有的这些优化中现实系统中都是无法测量到的,但我们不断的积累,较少成多。

最近的一次更新后我们又有了10%的提升。我们做了很多的修改。所有的测试都通过了,我们有100%的测试覆盖率,所以,我们相信,里面不会有太多的bug。但是,你们的试用是我们质量提升的重要一部分。请下载最新的alpha版试用,让我们知道你遇到的问题。谢谢。
找到一个进程正在使用的所有文件,比如日志
比如找叫ttserver的进程使用的文件
查看id
pidof ttserver
ls -la /proc/`pidof ttserver`/fd/



---------------------例子--------------------


来自:http://haoningabc.iteye.com/blog/1122862

如查mysql打开了哪些文件:
ps aux|grep mysql
PID: 3005
ls  -la  /proc/3005/fd/

Nginx:
ps aux|grep nginx
PID:  10906
查看它打开了哪些文件:
ls  -la  /proc/10906/fd/
l-wx------ 1 root root 64 1月  23 21:49 35 -> /usr/local/nginx/logs/access.log
l-wx------ 1 root root 64 1月  23 21:49 4 -> /usr/local/nginx/logs/error.log
l-wx------ 1 root root 64 1月  23 21:49 6 -> /data/logs/nginx/access_svn_boosh.log
l-wx------ 1 root root 64 1月  23 21:49 7 -> /data/logs/nginx/access_jiayuanmeng.log
背景:自己的虚拟机突然起不来了,ip没了,vmware的DHCP服务NAT服务在windows上都在,后来发现还是自己的windows下的vmware的dhcp没有启动起来,启动后好了。

问题描述:虚拟机使用wget命令上网,执行service network restart后出现如下错误

Determining IP information for eth0...failed

解决办法:

step1:修改/etc/sysconfig/network-scripts/ifcfg-eth0   BOOTROTO=dhcp

step2:向如下三个文件中添加如下代码



(1)/etc/sysconfig/network-scripts/ifcfg-eth0    
(2)/etc/sysconfig/networking/devices/ifcfg-eth0  
(3)/etc/sysconfig/networking/profiles/default/ifcfg-eth0
step3:设置PC为自动获取DNS,(也有其他方法)

step4:设置虚拟机自动获取ip

step5:重启系统!(注意:有时候执行service network restart等命令还是无用的)

摘自:http://blog.csdn.net/weiqing1981127/article/details/17955843
背景: 有的时候可能有网络访问链路异动也会导致我们的系统出现访问超时,延迟等情况。因为检测查看到达服务器的网络路由也是很有必要的。记的有一次国外系统访问国内服务器接口,由于机房运营商调整了网络链路,导致丢包严重,影响到系统的服务质量。
     mtr(my traceroute)命令相比ping和tracert及traceroute相比更加强大,而且以友好的格式化文本的形式方便我们查看到达任何一个网络节点或服务器的网络路由路径。

一个集合ping和traceroute功能并能直观显示结果的网络管理工具mtr;
官网地址
http://www.BitWizard.nl/mtr
下载地址
ftp://ftp.bitwizard.nl/mtr/
CentOS和Redhat可使用yum安装,一般系统默认已安装该工具;

实例: 查看本地服务器到baidu.com的路由路径情况:

mtr www.baidu.com


丢包率:Loss,已发送的包数:Snt,最后一个包的延时:Last,平均延时:Avg,最低延时:Best,最差延时:Wrst,方差(稳定性):StDev

local200-65.boyaa.com             Snt: 3     Loss%  Last   Avg  Best  Wrst StDev
192.168.200.1                                 0.0%   4.5   5.0   4.3   6.3   1.1
???                                          100.0   0.0   0.0   0.0   0.0   0.0
???                                          100.0   0.0   0.0   0.0   0.0   0.0
121.15.179.105                                0.0%   7.6   4.5   2.8   7.6   2.7
58.60.24.57                                  33.3%   2.6   3.9   2.6   5.1   1.7
119.145.45.245                                0.0%   2.1  10.2   1.8  26.8  14.3
202.97.64.61                                  0.0%  25.1  26.0  24.5  28.5   2.2
202.102.73.98                                 0.0%  33.1  31.2  28.7  33.1   2.3
???                                          100.0   0.0   0.0   0.0   0.0   0.0
180.97.32.10                                  0.0%  25.5  29.6  25.5  34.8   4.7
???                                          100.0   0.0   0.0   0.0   0.0   0.0
180.97.33.107                                 0.0%  24.4  25.4  24.4  27.5   1.8


摘自:http://blog.csdn.net/fableboy/article/details/38566635
参考:http://blog.sina.com.cn/s/blog_4d8a2c970100fy1x.html

mtr(a network diagnostic tool)是一个神奇的指令,能按要求对路由中所有节点进行批量测试。简单敲一个“mtr qq.com”将会有意外收获!

当需要进行产品级的网络测试时,可在服务器上运行一段时间的mtr测试形成报告。如下脚本:


脚本会对网址列表进行1万次遍历,打印每次的丢包率和平均延时时间。网址可以随意添加,生成csv文件用Excel处理生成图表。希望对你也有用!

来自:http://www.51testing.com/html/28/116228-808230.html
问题:
ping某台机器时,偶尔返回慢,如何检测到这块网络波动能认人直观看到?免得有人说网络没有问题。
建议用脚本做,不要用c实现:
ping -w 1 -c 1 $2>/dev/null
//调用ping函数,-w为超时时间;-c为ping的次数;
ping -w 1 -c 1 $2
从脚本所在机去ping之后pingcmd函数的第二个参数(本例为之后建立的serve1-7),超时1秒,执行1次

[root@emulMachine ping]# ping -c 2  baidu.com  
PING baidu.com (220.181.57.216) 56(84) bytes of data.
64 bytes from 220.181.57.216: icmp_seq=1 ttl=52 time=19.7 ms
64 bytes from 220.181.57.216: icmp_seq=2 ttl=52 time=2.52 ms

--- baidu.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 2.520/11.141/19.763/8.622 ms
LINUX系统ping命令完整实现(带路由追踪参数):

http://download.csdn.net/download/sjgtongji/4421406

Windows:
ping -n 100 -r 9 -w 1000 10.70.56.88(发送100个数据包,最多记录9个路由,1000毫秒也就是1秒。)
C:\Users\admin>ping -n 100 -r 9 -w 1000 baidu.com   (发送100个数据包,最多记录9个路由,1000毫秒也就是1秒。)

正在 Ping baidu.com [123.125.114.144] 具有 32 字节的数据:
来自 123.125.114.144 的回复: 字节=32 时间=17ms TTL=56
    路由: 172.21.3.1 ->
           202.108.16.69 ->
           61.49.42.130 ->
           202.106.229.58 ->
           202.106.229.57 ->
           202.106.227.10 ->
           10.23.190.129 ->
           10.23.190.97 ->
           10.23.190.138
来自 123.125.114.144 的回复: 字节=32 时间=14ms TTL=56
    路由: 172.21.3.1 ->
           202.108.16.69 ->
           61.49.42.130 ->
           61.148.143.22 ->
           61.148.143.21 ->
           61.49.168.89 ->
           10.23.190.129 ->
           10.23.190.97 ->
           10.23.190.138
Linux:
ping -c 9  -w 1000 10.70.56.88 (发送9个数据包,最多记录9个路由,1000毫秒也就是1秒。)
[root@emulMachine vhost]# ping -c 9  -w 1000 10.70.56.88      
PING 10.70.56.88 (10.70.56.88) 56(84) bytes of data.
64 bytes from 10.70.56.88: icmp_seq=1 ttl=61 time=0.570 ms
64 bytes from 10.70.56.88: icmp_seq=2 ttl=61 time=0.545 ms
64 bytes from 10.70.56.88: icmp_seq=3 ttl=61 time=0.533 ms
64 bytes from 10.70.56.88: icmp_seq=4 ttl=61 time=0.545 ms
64 bytes from 10.70.56.88: icmp_seq=5 ttl=61 time=0.541 ms
64 bytes from 10.70.56.88: icmp_seq=6 ttl=61 time=0.552 ms
64 bytes from 10.70.56.88: icmp_seq=7 ttl=61 time=0.557 ms
64 bytes from 10.70.56.88: icmp_seq=8 ttl=61 time=0.558 ms
64 bytes from 10.70.56.88: icmp_seq=9 ttl=61 time=0.559 ms
____________________________________________________________________________________________________
C:\Users\admin>ping --help
Windows参数:
-n count       要发送的回显请求数。
-r count       记录计数跃点的路由(仅适用于 IPv4)。
-w timeout     等待每次回复的超时时间(毫秒)。

Linux下参数:
ping --help
[-w deadline]  :等待每次回复的超时时间(毫秒)。
[-c count]       :ping 多少次如:-c 2:表示ping两次。
linux下的ping没有像windows下的ping有一个-r的路由:
只能linux下用traceroute,windows下用:tracert baidu.com。
Linux下有一个mtr, mtr baidu.com icmp 这玩意不错可以试试不错,有丢包率。
____________________________________________________________________________________________________
Centos下的-w和-c测试如下:
[root@emulMachine ping]# ping -c 6 -w 1 baidu.com
PING baidu.com (123.125.114.144) 56(84) bytes of data.
64 bytes from 123.125.114.144: icmp_seq=1 ttl=52 time=29.9 ms

--- baidu.com ping statistics ---
2 packets transmitted, 1 received, 50% packet loss, time 1000ms
rtt min/avg/max/mdev = 29.930/29.930/29.930/0.000 ms
[root@emulMachine ping]# ping -c 6 -w 10 baidu.com
PING baidu.com (220.181.57.217) 56(84) bytes of data.
64 bytes from 220.181.57.217: icmp_seq=1 ttl=51 time=1.69 ms
64 bytes from 220.181.57.217: icmp_seq=2 ttl=51 time=80.2 ms
64 bytes from 220.181.57.217: icmp_seq=3 ttl=51 time=1.75 ms
64 bytes from 220.181.57.217: icmp_seq=4 ttl=51 time=1.90 ms
64 bytes from 220.181.57.217: icmp_seq=5 ttl=51 time=2.09 ms
64 bytes from 220.181.57.217: icmp_seq=6 ttl=51 time=1.62 ms

--- baidu.com ping statistics ---
6 packets transmitted, 6 received, 0% packet loss, time 5004ms
rtt min/avg/max/mdev = 1.622/14.889/80.268/29.238 ms


——————————————————————————————————————————————————————
给个ping 的-w:timeout详解
其实在命令提示符的帮助中已经说明了,
-w timeout     Timeout in milliseconds to wait for each reply.
意思是,按毫秒记每一个应答的超时时间。1000毫秒=1秒
假如,我的网络很差,延迟很大,我ping www.baidu.com,如果我将超时时间设置很短如10毫秒,那么如果发出一个数据包10毫秒内没有收到应答包的话,就给出请求超时的提示。但是如果我将超时时间设置为100000毫秒,就是100秒。那么我就有可能收到类似应答信息
Reply from 61.135.169.105: bytes=32 time=2952ms TTL=47
可以看到time是2952毫秒就是2秒钟,说明网络很差。如果你将超时时间设置为10毫秒,都可以收到应答信息,那么你的网络就非常好。
ping www.baidu.com -w 1000 是使用的方式

来自:http://zhidao.baidu.com/link?url=HjOEnYDQX6WLcfOJibiBLTO7hb66DEEtrtCwJPH7SDRBzu76Lkc_4EjIzqeWmgGrFYeO9NNQ9THl-EaDEk6Ujq

ping -r 的用法?
ping-r count Record route for count hops.
在“记录路由”字段中记录传出和返回数据包的路由。

在一般情况下你发送的数据包是通过一个个路由才到达对方的,但到底是经过了哪些路由呢?通过此参数就可以设定你想探测经过的路由的个数,不过限制在了9个,也就是说你只能跟踪到9个路由,如果想探测更多,可以通过其他命令实现,我将在以后的文章中给大家讲解。以下为示例:

C:\>ping -n 1 -r 9 202.96.105.101 (发送一个数据包,最多记录9个路由)

Pinging 202.96.105.101 with 32 bytes of data:

Reply from 202.96.105.101: bytes=32 time=10ms TTL=249
Route: 202.107.208.187 ->
202.107.210.214 ->
61.153.112.70 ->
61.153.112.89 ->
202.96.105.149 ->
202.96.105.97 ->
202.96.105.101 ->
202.96.105.150 ->
61.153.112.90

Ping statistics for 202.96.105.101:
Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
Minimum = 10ms, Maximum = 10ms, Average = 10ms

从上面我就可以知道从我的计算机到202.96.105.101一共通过了202.107.208.187 ,202.107.210.214 , 61.153.112.70 , 61.153.112.89 , 202.96.105.149 , 202.96.105.97这几个路由。
来自:http://zhidao.baidu.com/link?url=PI0CZGLokQxxVEGzbrH_FrxRlAaI-vc3AzzX-Ta8K-fQFZmhF3oIcLd94poNvOONL4hI7iQRH6UTE9T6PWaViq

阅读全文
PHP-FPM的单进程单线程模型,用ps 命令,-L参数显示进程,并尽量显示其LWP(线程ID)和NLWP(线程的个数),如下:
[root@rh08 none]# ps -eLf | grep php-fpm
www      39154 22867 39154  2    1 10:38 ?        00:00:01 php-fpm: pool www                                                                                                            
www      39155 22867 39155  2    1 10:38 ?        00:00:01 php-fpm: pool www                                                                                                            
www      39156 22867 39156  2    1 10:38 ?        00:00:01 php-fpm: pool www                                                                                                            
www      39157 22867 39157  2    1 10:38 ?        00:00:01 php-fpm: pool www                                                                                                            
www      39158 22867 39158  2    1 10:38 ?        00:00:01 php-fpm: pool www
上面命令查询结果的第二列为PID,第三列为PPID,第四列为LWP,第六列为NLWP。

ps命令还可以查看线程在哪个CPU上运行:
[root@rh08 none]# ps -eo ruser,pid,ppid,lwp,psr,args -L | grep php
root     22867     1 22867   1 php-fpm: master process (/usr/local/php/etc/php-fpm.conf)                                                                    
www      38929 22867 38929   0 php-fpm: pool www                                                                                                            
www      38930 22867 38930   0 php-fpm: pool www                                                                                                            
www      38934 22867 38934   0 php-fpm: pool www                                                                                                            
www      38935 22867 38935   0 php-fpm: pool www                                                                                                            
www      38936 22867 38936   0 php-fpm: pool www                                                                                                            
www      38937 22867 38937   1 php-fpm: pool www    
From:http://smilejay.com/2012/06/linux_view_threads/

Htop:
yum install htop  
Installed:
  htop.x86_64 0:1.0.3-1.el6
Display Options ,[V]Tree view  [V]show custom thread name ,勾选是空格键盘,上下键移动菜单条目,OK后,按<F10>退出设置,左斜杠搜索F2也是搜索,F3是Next,ESC推出。
一个对用户更加友好的方式是,通过htop查看单个进程的线程,它是一个基于ncurses的交互进程查看器。该程序允许你在树状视图中监控单个独立线程。
要在htop中启用线程查看,请开启htop,然后按<F2>来进入htop的设置菜单。选择“设置”栏下面的“显示选项”,然后开启“树状视图”和“显示自定义线程名”选项。按<F10>退出设置。
From: http://www.codeceo.com/article/linux-find-thread.html

0.最常用 pstree:
[root@iZ25dcp92ckZ temp]# pstree -a|grep multe
  |       |   `-multepoolser
  |       |       `-multepoolser
  |       |           `-2*[{multepoolser}]

1. > top

可以显示所有系统进程

按u, 再输入相应的执行用户名称,比如Tom

可以看到Tom用户启动的所有进程和对应的pid

2. > pstack pid

可以看到此pid下,各线程的运行状态、

[root@test multepoolserver]# pstack  14944  (进程的PID号)
Thread 2 (Thread 0x41ed5940 (LWP 14945)):
#0  0x0000003c9ae0d5cb in read () from /lib64/libpthread.so.0
#1  0x00000000004017b6 in sync_additional_writing_worker ()
#2  0x0000003c9ae064a7 in start_thread () from /lib64/libpthread.so.0
#3  0x0000003c9a2d3c2d in clone () from /lib64/libc.so.6
Thread 1 (Thread 0x2b24b3094250 (LWP 14944)):
#0  0x0000003c9a2d4018 in epoll_wait () from /lib64/libc.so.6
#1  0x0000000000401d59 in Process ()
#2  0x00000000004029b8 in main ()

来自:http://blog.csdn.net/wind_324/article/details/6152912

方法一:
ps -ef f
用树形显示进程和线程
在Linux下面好像因为没有真正的线程,是用进程模拟的,有一个是辅助线程,所以真正程序开的线程应该只有一个。

方法二:
[root@apache dhj]# ps axm|grep httpd

方法三:
另外用pstree -c也可以达到相同的效果,但是没有线程号:
[root@apache dhj]# pstree -c|grep httpd

来自:http://blog.chinaunix.net/uid-346158-id-2131012.html
阅读全文
背景:Linux下的硬件有很多,如何看网卡是啥样的,声卡是啥样的有几个USB口及品牌。


该命令作用:将lspci的输出当做输入,从中找出包含Eth的行。在我的Fedora机器上运行结果为

[root@localhost etc]# lspci | grep Eth
00:04.0 Ethernet controller: Silicon Integrated Systems [SiS] SiS900 PCI Fast Ethernet (rev 91)

lspci命令解说:该命令能列出机器中的PCI设备信息,如声卡,显卡,Modem,网卡等信息,主板集成设备的信息也能列出来,lspci读取的是hwdata数据库。

| 管道命令,之前的输出作为之后的输入

grep grep命令后设置指定过滤的字符串,任何没有包括指定字符串的行都不会显示。

来自:http://www.cnblogs.com/xiandedanteng/archive/2013/08/23/3277746.html
背景:当你在做一些多进程调试时,会出现一个问题,那就是子进程往往不太好调试,怎么办?如果子进程一直在while里飞快的运行着怎么办,这篇文章就是教会你进行双gdb调试,以实现了子进程的调试,这儿在没有调试时,其子进程是不断的打印,当然最好在while里加一个sleep,但第二个gdb进入后则会存在第一个gdb的打印变慢了,此时,可以在第二个gdb里打印相关变量,达到对子进程的调试目的,特别注意的是,第二个gdb一定要在那个子进程的行里break(这儿是31行)进行调试,而不是放在其它地方,否则是没法调试到子进程的。第三个是:进程中断点.然后用c(这里要用continue,因为attach的进程已经在运行了,不能用run)。最后,子进程死了父亲进程拉起,crack这块可能是return退出了,自己打印是crack,导致并不是真正的crack了,也就不是coredump了,特别注意这个问题。
     当你在程序中使用fork(),如果用gdb来调试.不管是你在子进程是否设置断点.你都只能在父进程单步调试,而没办法进入到子进程当中进行单步调试.因为gdb的所有处理(查看堆栈,内存,变量值)都是针对当前进程空间.

那么是否就没办法调试多进程程序的子进程代码呢?办法还是有的,一般的标准方法是再打开一个gdb用attach功能来调试子进程gdb attach 功能是不执行被调试程序,而是把gdb“挂”到一个已经运行的进程之上来进行调试,这挂载的动作称为attach.当然也包括挂载子进程。

注意两点:
0.当主gdb进来后进行断点后,子进程尽管断点了,但依然运行(为第二个gdb作暂停准备之用),而当第二个gdb对子进程进行attach后,其主gdb的子进程的打印动作也就暂停(为方便调试,可以在进程启动后,设定sleep一段时间,如30s,其实只要第二个gdb一attach到子进程,子进程就柱塞了。),此时子gdb再进行设置断点,按c运行,按n作next就行。
1.子进程的主gdb点和第二个gdb的break点要同一行?不必要,其主gdb只是起到在第二个gdb单独调该进程时起到暂停其主的子进程的作用罢了。
2.在子进程的gdb里,要用c来继续,(这里要用continue,因为attach的进程已经在运行了,不能用run!(也就是:主进程用r(先运行着,主进程不退出。),子进程用c,继续在原来那个停下来的点继续运行到后,再用n命令,即next一步一步查问题,n(next):显示的是即将运行这一行,也就是还没有运行。)
3.gdb调试epoll时遇到的Interrupted system call:
signal(SIGALRM,timer_handle);
最近写了个多线程数据处理的程序,其中用到sem_wait()在信号量为0的时候挂起程序. 程序全速执行的时候没有任何问题,但gdb单步调试的时候,因执行sem_wait()函数而挂起的线程经常出现Interrupted system call,不能正常执行.
    原因在于,gdb单步调试的时候会在断点处插入一条中断指令,当程序执行到该断点处的时候会发送一个SIGTRAP信号,程序转去执行中断相应,进而gdb让程序停下来进行调试. 对于sem_wait\wait\read等会阻塞的函数在调试时,如果阻塞,都可能会收到调试器发送的信号,而返回非0值.
    为了解决这个问题需要在代码中忽略由于接收调试信号而产生的"错误"返回:


到一篇文章《gdb常用命令及使用gdb调试多进程多线程程序》:http://www.cnblogs.com/33debug/p/7043437.html ,代码编译无法通过,代码调整如下,gdb_pthread.c:



关于GDB无法调试epoll的疑问?
这种交互式的网络程序最好不用gdb来调?
调试网络通讯程序最好别用GDB,epoll你可以用strace,gdb是用来调试 C数据结构逻辑之类的。
打日志是我的首选调试方法,如果程序崩溃就看core 文件,如果死锁就 attach上去,其他的错误我从不用GDB
不是epoll和gdb的问题,而是在gdb下epoll_wait 信号处理和正常运行有差异造成的,应该是这个。
摘自:http://bbs.chinaunix.net/thread-1551201-1-1.html

多进程调试如下所述即可,如下,特别是新的linux内核版本能支持到多进程了,相当好用:
在2.5.60版Linux内核及以后,GDB对使用fork/vfork创建子进程的程序提供了follow-fork-mode选项来支持多进程调试。
follow-fork-mode的用法为:
set follow-fork-mode [parent|child]
parent: fork之后继续调试父进程,子进程不受影响。
child: fork之后调试子进程,父进程不受影响。
因此如果需要调试子进程,在启动gdb后:
(gdb) set follow-fork-mode child

这块可以研究一下,新的内核及新的gdb有新功能很方便使用:
set follow-fork-mode child
//set detach-on-fork on //gdb控制父子进程,不让调试了: Can't attach LWP 24731: Operation not permitted,得打开:ON。
b 146 //main里的子进程行
b 192  //子进程调用的函数原型行
r //执行到子进程断点处
n //子进程单步执行

实践心得:一般情况下多线程的时候,由于是同时运行的,最好设置 set scheduler-locking on 这样的话,只调试当前线程 。
off 不锁定任何线程,也就是所有线程都执行,这是默认值。 on 只有当前被调试程序会执行。
vi bp.list

gdb.sh

(一)这块在调试epoll时,在n单步执行卡后(c执行前先断点),得通过浏览器模拟socket请求才能过得去,否则会一直卡那儿,如下:


这块如果continue后,中间因为断点就一次是没法下次进入的,需要引入gdb判断(if {expression} else end条件判断语句, if 后面所带的表达式为一般的GDB表达式:http://blog.csdn.net/horkychen/article/details/9372039)及观察点,才能更加深入了解,下面是试图没有断点运行起来后实现ctrl+C退出,想继续n的尝试:
(二)再就是对c后一直卡那儿,可以按ctrl+C退出( SIGINT   :来自键盘的中断信号 ( ctrl + c ) .),SIGTERM:kill 命令发出 的信号.,继续n执行:
Program received signal SIGINT, Interrupt.
0x0000003c9a2d3fd3 in __epoll_wait_nocancel () from /lib64/libc.so.6
(gdb) n
Single stepping until exit from function __epoll_wait_nocancel,
which has no line number information.

这块不知怎么回事....需要进一步学习了解。

Process(listenFd); //运行至工作子进程的函数,;b 192进行单步执行。


学习参考:
http://blog.csdn.net/nyist327/article/details/40040011
http://blog.sina.cn/dpool/blog/s/blog_55d572ca0100v8e8.html

修改如下:


主gdb:
(gdb) b 167
Breakpoint 1 at 0x4025a1: file multipepollserver.cpp, line 167.
(gdb) b 147
Breakpoint 2 at 0x40250f: file multipepollserver.cpp, line 147.
(gdb) r
Starting program: /home/xiangdong/multepoolserver/multipepollserver
[Thread debugging using libthread_db enabled]
Detaching after fork from child process 27539.
[New Thread 0x2afb66031230 (LWP 27536)]

Breakpoint 1, main (argc=1, argv=0x7fff550003c8, envp=0x7fff550003d8) at multipepollserver.cpp:168
168    

辅助gdb:
(gdb) b 147
Breakpoint 1 at 0x40250f: file multipepollserver.cpp, line 147.
(gdb) c
Continuing.
n

以上代码来自,也就是上面的程序调试的整个代码放在:http://jackxiang.com/post/6937/  ,不完善进一步学习中。

来自:
    http://blog.sina.com.cn/s/blog_5cec1e1d0100guwf.html
    http://blog.csdn.net/qiaoliang328/article/details/7404032
    http://bbs.csdn.net/topics/380004392
首先我们看一个如下简单的多进程程序。
阅读全文
背景:配置仓库结合svn版本控制工具
saltstack的安装使用
centos6.3_x86_64
安装EPEL第三方软件源
wget -c http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -ivh epel-release-6-8.noarch.rpm
安装
yum install salt-master -y  //master
yum install salt-minion     //clients
chkconfig --list|grep salt   //master默认监听两个端口, 4505(publish_port)为salt的消息发布系统,4506(ret_port)为salt客户端与服务端通信的端口,所以确保客户端能跟服务端的这2个端口通信
salt-master     0:off   1:off   2:off   3:on    4:on    5:on    6:off
salt-syndic     0:off   1:off   2:off   3:on    4:on    5:on    6:off
chkconfig --list|grep salt   //clients   没有端口,只有进程
salt-minion     0:off   1:off   2:off   3:on    4:on    5:on    6:off
配置
/etc/init.d/salt-master start  //master直接启动,若也要作为clients,install salt-minino,修改master和id
vi /etc/salt/minion    //clients
master: 192.168.2.18   //冒号后面有空格
/etc/init.d/salt-minion start  
认证
salt-key -L //all list 详细可salt-key --help
实时管理
salt "localhost.localdomain" cmd.run "df -Th"
localhost.localdomain:
    Filesystem    Type    Size  Used Avail Use% Mounted on
    /dev/mapper/VolGroup-lv_root
                  ext4     19G  6.5G   11G  38% /
    tmpfs        tmpfs    244M     0  244M   0% /dev/shm
    /dev/sda1     ext4    485M   40M  420M   9% /boot
群发
salt "*" cmd.run "ls -al /opt/io.sh"
localhost.localdomain:
    -rwxr-xr-x 1 root root 396 Jun  8 18:22 /opt/io.sh
过滤匹配
salt '192.168.*' cmd.run 'echo hi'  
正常我们每台主机的HOSTS都是这样
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
为了区分开来并且MASTER也作为客户端
vi /etc/salt/minion
39 id: 192.168.2.18  //或者修改为自定义名称 比如 id: salt-master,修改id后客户端必须重启,salt-keys -L 才能认得到 然后加入-a 如果修改过ID,最好把旧的删掉 -d
salt-key -D      //删除所有KEY
salt-key -d key  //删除单个key
salt-key -A      //接受所有KEY
salt-key -a key  //接受单个key
[root@server1 salt]# salt-key -L
Accepted Keys:
Unaccepted Keys:
192.168.2.18
192.168.2.19
Rejected Keys:
[root@server1 salt]# salt-key -a 192.168.2.18
Key for minion 192.168.2.18 accepted.
[root@server1 salt]# salt-key -a 192.168.2.19
Key for minion 192.168.2.19 accepted.
[root@server1 salt]# salt-key -L
Accepted Keys:
192.168.2.18
192.168.2.19
Unaccepted Keys:
Rejected Keys:
测试服务端和客户端通讯
salt "192.168.2.19" test.ping     //单引号也可以
192.168.2.19:
    True
salt "*" salt.modules.disk    //salt.modules.disk  模块

服务端:
vi /etc/salt/master
nodegroups:
    mytest1: 'S@192.168.2.0/24'    
salt -N mytest1 test.ping
192.168.2.18:
    True
client1_2.19:
    True
KEYS名字  nodegroups:
    test1: 'L@192.168.2.18,client1_2.19' //多个
    test2: 'client1_2.19'   //单个

来自:http://www.2cto.com/os/201308/238485.html
背景:共享库,主版本升级,即接口发生变化。
Makefile有一句:
DYLIB_MAKE_CMD=$(CC) -shared -Wl,-soname,$(DYLIB_MINOR_NAME) -o $(DYLIBNAME) $(LDFLAGS)
编译下看看输出:
[hiredis]# make clean
rm -rf libhiredis.so libhiredis.a hiredis-test examples/hiredis-example* *.o *.gcda *.gcno *.gcov
[hiredis]# make
cc -std=c99 -pedantic -c -O3 -fPIC  -Wall -W -Wstrict-prototypes -Wwrite-strings -g -ggdb  net.c
cc -std=c99 -pedantic -c -O3 -fPIC  -Wall -W -Wstrict-prototypes -Wwrite-strings -g -ggdb  hiredis.c
cc -std=c99 -pedantic -c -O3 -fPIC  -Wall -W -Wstrict-prototypes -Wwrite-strings -g -ggdb  sds.c
cc -std=c99 -pedantic -c -O3 -fPIC  -Wall -W -Wstrict-prototypes -Wwrite-strings -g -ggdb  async.c
cc -shared -Wl,-soname,libhiredis.so.0.11 -o libhiredis.so  net.o hiredis.o sds.o async.o
静态编译:
ar rcs libhiredis.a net.o hiredis.o sds.o async.o
一)这个/home/test/rpmbuild/BUILD/ngx_http_monitor_module-2.2.0/hiredis 目录下面也并没有:
ls libhiredis.so.0.11
ls: cannot access libhiredis.so.0.11: No such file or directory
readelf -d libhiredis.so
静态就是纯静态的:
ldd libhiredis.a
ldd: warning: you do not have execution permission for `./libhiredis.a'
        not a dynamic executable

Dynamic section at offset 0xa7f0 contains 21 entries:
  Tag        Type                         Name/Value
0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]
0x000000000000000e (SONAME)             Library soname: [libhiredis.so.0.11]   <===就是这个就是-soname,libhiredis.so.0.11编译进去的。

二)Nginx启动后,并找不到这个:
ldd /usr/local/nginx/sbin/nginx
        libhiredis.so.0.11 => not found
Starting nginx: /usr/local/nginx/sbin/nginx: error while loading shared libraries: libhiredis.so.0.11: cannot open shared object file: No such file or directory

=============================================================================================


怎么样实现把共享库的soname 提取出来,写在自己的共享库的头文件里面?
第二个是动态库的soname( Short for shared object name),依赖该shared library的应用程序中记录了它的soname,所以应用程序加载该shared library的时候,其寻找共享库用的soname文件名。其格式为

                           lib + math+.so + ( major version number)

它是一个指向名字为real name的shared library的软链接。

  当升级主版本时,共享库的soname 就会加1.比如libhello.so.0.0.0 变为 libhello.so.1.0.0. 这时候再运行ldconfig 文件,就会发现生成两个连接 文件。
    ln -s libhello.so.0---->libhello.so.0.0.0
    ln -s libhello.so.1----->libhello.so.1.0.0
尽管共享库升级,但是你的程序依旧用的是旧的共享库,并且两个之间不会相互影响。

    问题是如果更新的共享库只是增加一些接口,并没有修改已有的接口,也就是向前兼容。但是这时候它的主版本号却增加1. 如果你的应用程序想调用新的共享库,该怎么办? 简单,只要手工把soname 文件修改,使其指向新的版本就可以。(这时候ldconfig 文件不会帮你做这样的事,因为这时候soname 和real name 的版本号主板本号不一致,只能手动修改)。
  比如: ln -s libhello.so.0 ---> libhello.so.1.0.0
  但是有时候,主版本号增加,接口发生变化,可能向前不兼容。这时候再这样子修改,就会报错,“xx”方法找不到之类的错误。

这就是接下来要介绍的第三个共享库的名字,link name,顾名思义,就是在编译过程,link 阶段用的文件名。 其将soname 和real name 关联起来。
第三个名字,共享库的连接名(link name),是专门为build 阶段连接而用的名字。这个名字就是lib + math +.so ,比如libmath.so。其是不带任何版本信息的。在共享库编译过程中,连接(link) 阶段,编译器将生成一个共享库及real name,同时将共享库的soname,写在共享库文件里的文件头里面。可以用命令 readelf -d sharelibrary 去查看。

在应用程序引用共享库时,其会用到共享库的link name。在应用程序的link阶段,其通过link名字找到动态库,并且把共享库的soname 提取出来,写在自己的共享库的头文件里面。当应用程序加载时就会通过soname 去给定的路径下寻找该共享库。
参考:
http://blog.163.com/kefeng_1984/blog/static/166615272014714114141296/
http://blog.chinaunix.net/uid-23592843-id-223539.html

阅读全文
分页: 12/22 第一页 上页 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 下页 最后页 [ 显示模式: 摘要 | 列表 ]