预告:最后我安装了盗版的VMware8,升级了一下(会提示你卸载旧版本),也就没有下面一堆的乱七八糟的问题了,但那个192.168.137.1还是由那个注册表修改下,NAT方式Linux也就能上网了。
背景:重装系统后,配置Vmware后有可能里面的Linux无法上网。尽管IP一样的,但是就他妈的上不了外网,给升级Rpm包带来困难,路由如下:
root@192.168.137.128:~# traceroute baidu.com
traceroute to baidu.com (220.181.111.86), 30 hops max, 60 byte packets
1  192.168.137.2 (192.168.137.2)  0.348 ms  0.307 ms  0.295 ms
2  * * *
3  * * *
4  * * *
修改后是这样的:
root@192.168.137.128:~# traceroute baidu.com
traceroute to baidu.com (220.181.111.86), 30 hops max, 60 byte packets
1  192.168.137.1 (192.168.137.1)  0.188 ms * *
2  * * *
3  * * *
。。。。。。
29  * * *
30  * * *
也就是说还是没明确的路由,但Ping是通的,Curl是通的,能获取到数据就是Ok。

......
Is this ok [y/N]: y
Downloading Packages:
traceroute-2.0.14-2.el6.x86_64.rpm    
......
Running Transaction
  Installing : 3:traceroute-2.0.14-2.el6.x86_64    
  Verifying  : 3:traceroute-2.0.14-2.el6.x86_64    
Installed:
  traceroute.x86_64 3:2.0.14-2.el6      
Complete!
________________________________________________________________________________________________________
防火墙是要开启的,否则在共享时会返回null的问题:
1.services.msc
2.找到:Windows Firewall,启动类型:自动,启动:让服务状态为已启动。
——网上其实很多方法,都不行,我想可能是Vmware6.0和其下面的虚拟机的一个重装后的小Bug—————
解决办法:【第8条才是关键,特别注意。】
0)删除:修改 /etc/udev/rules.d/70-persistent-net.rules 文件
删除掉 关于 eth0 的信息。修改 第二条 eth1 的网卡的名字为 eth0. 重启服务器。
http://jackxiang.com/post/5651/
1)移动:下ifcfg-eth0到ifcfg-eth0.bak
2)关闭:ifconfig eth0 down
3)启动:ifconfig eth0 up
4)  重置:/etc/init.d/network reload
5)还原:ifcfg-eth0.bak -》ifcfg-eth0
6)重启:service network restart
7)把services.msc里的Vmware服务都全开了。
8)一系列都做了通过service network restart还是不能获取到新的DHC ip段:
VMware下->Edit->Virtue Network Settings...->DHCP->选 Vmware8(properties)->Start IP address(这块由:192.168.137.128修改最后一位:129),也就再service network restart 获取到129了,再修改回去就成(我估计这里之所以修改128成129是因为DHCP有缓存:192.168.157.128终于变为:192.168.137.128),呵呵,不容易,不知vmware的高版本有没有这个问题。
9)有时间win7要修改成:192.168.137.128 才能上网,而前面默认就是128,你得修改下vmware下的linux才能变IP第三位(由129变到128),而你修改的是最后一位128到129,于是你想还回去,可就又不行了,这也是vmware6.0的问题,这样就Ok了:
你再修改为更低:如:192.168.137.120 (128),再修改下注册表到另外的IP(192.168.138.0),再启动Vmware进行修改到:192.168.138.128。为此,你再关闭后修改注册表改回:192.168.137.0,启动vmware还回去(192.168.137.128)就可以了。
其实以上所有操作都是为了能让vmware下的linux能够获取到正确且能上网的ip:192.168.137.128。这个128是由dhcp确定的,必须修改,但修改后又有可能上不了外网。(这点也是奇怪的),也就只能这样折腾了,vmware6.0害人呐,呵呵。

最后,这个Vmware6.0下的虚拟Linux也就可以上网更新rpm了,NAT的Vmware6.0生成的Vmware8的访问类型:无法连接到Internet(其实也能访问),再就是防火墙要打开,否则共享会出现null的提示。
vi /etc/sysconfig/network-scripts/ifcfg-eth0  
阅读全文
https://bitbucket.org/PinIdea/fcgi_ext/
老外点评:
该用法有点意思,不过是特定场景下的应用:
有点像分布式事务
规避php的高资源消耗
原先的php代码中需要访问solr获得搜索结果,然后回传nginx
但是solr不稳定,或者说获得结果的时间比较长,不确定
这样php代码必须得持有很多资源等待结果
所以导致系统负载很大
改进方案就是在nginx和php之间增加golang的deamon程序
让golang去等待搜索结果
得到结果后,扔给后方的php,再回传nginx
所以golang等待的时候,就不会持有那么多资源
每次vim 一个文件,光标都在最上面的位置,不是上次我编辑的位置了..
进入vim后键入:
'0
即回到当初你编辑的位置
ctrl + o 回到光标回到上次位置
ctrl+i,ctrl+o跳转位置,完全没看手册啊

try  Ctrl+ o
配合ctrl + ] 阅读代码时尤其便捷
——————————————————————
PS: 如果想把光标停止在指定的行, 这样
vim +n urfile // n为行号
如果要停留在行尾, 这样
vim + urfile
来自:http://bbs.chinaunix.net/forum.php?mod=viewthread&tid=1024941&page=1
http://blog.longwin.com.tw/2012/09/vim-last-read-line-2012/
http://bbs.chinaunix.net/thread-1271757-1-1.html


vim-重新打开回到上次所编辑文件的位置:
应用场景:
在每次退出一份文件后再重新打开该文件时,希望光标停留在当时退出的地方;也就是说当我程序写到hello.c的第100列时突然有事必须关电脑了,那在我下次打开电脑以vim打开hello.c, 希望光标还是停留在第100列,怎么办?

解决方案就是在.vimrc里面加上这一行即可:
au BufReadPost * if line("'\"") > 0|if line("'\"") <= line("$")|exe("norm '\"")|else|exe "norm $"|endif|endif  

google大神的礼物: 
http://bbs.chinaunix.net/viewthread.php?tid=1024941&page=1
我的无线WIFI设置成这个iP以后,连接到这个WIFI的用户才能上网,设置成192.168.0.1就不行,为什么?
192.168.136.*也不行,但我不知道为什么?是不是192.168.137.*这个IP 段具有特别的意义?

是这样的:因为在192.168.1.0/24这个的意思就是说前24位是网络位,而后八位是主机位
在你的网关中规定了,子网掩码是255.255.255.0对吧?这个的意思和/24一样,只不过是另一种表示方式,而你的网关地址应该是192.168.137.*对吧,这两个数据确定了你网络192.168.137.0
并不是这个ip有什么特别,在路由器里设置一下就好了

点击确定(OK)之后,将会出现如下的说明:
大致是说,将会自动把无线网卡的ip地址设置成为192.168.137.1的地址。
点击确定(OK),即可。
win7简单搭建WIFI热点使iphone快速上网(很仔细)
2012-1-26 12:35:21 上传下载附件 (27.5 KB)


(10)、这个时候查看无线网卡的IP地址,确保一定要是上面提示说明的IP地址。
ip地址:192.168.137.1
掩码:255.255.255.0


摘录:http://bbs.app111.com/thread-176775-1-1.html
这个更界面化:http://www.cnblogs.com/rocketfan/archive/2009/11/15/1603465.html

GNU gprof 是一款linux平台上的程序分析软件(unix也有prof)。借助gprof可以获得C程序运行期间的统计数据,例如每个函数耗费的时间,函数被调用的次数以及各个函数相互之间的调用关系。gprof可以帮助我们找到程序运行的瓶颈,对占据大量CPU时间的函数进行调优(gprof统计的只是CPU的占用时间,对I/O瓶颈貌似无能为力,耗时甚久的I/O操作很可能只占据极少的CPU时间)。
gprof的使用非常简单,在编译链接的时候加上"-pg"选项,然后按照正常方式运行程序,如果程序正常退出,一个名为gmon.out将会产生。使用gprof可查看gmon.out中的统计结果:

gprof <options> [executable-file] [profile-data-file(s)……] [>outfile]

可通过man gprof 查看各选项含义,通常会加上"-b"选项禁止显示冗长的说明信息。
executable-file如果没有指定,则会默认为a.out。
profile-data-file可跟多个文件,若没有指定,默认gmon.out。
统计信息较多,最好重定向到outfile方便查看。
最终呈现的统计信息包括两张表:flat table和call graph。flat table列出了各个函数的运行时间(不包括子函数)及所占总运行时间的比率,函数的调用次数;call graph还包括函数之间的调用关系,详细列出了每个函数在它的各个子函数上所耗费的时间。
下面一个简单的例子说明一下两张表中各项的含义:
待分析的程序源码:
#define MAX 10000000
void f() {
long long sum = 0;
for (long long i=0;i<MAX;i++)
sum += i;
}
void g() {
long long sum = 0;
for (long long i=0;i<MAX;i++)
sum += i;
f();
}
int main() {
long long sum = 0;
for (long long i=0;i<MAX;i++)
sum += i;
f();
g();
}

Flat profile:
Each sample counts as 0.01 seconds.
  %          cumulative          self         self                           total          
time         seconds         seconds    calls        ms/call      ms/call     name    
50.00         0.07                 0.07         2            35.00       35.00         f()
28.57         0.11                 0.04         1            40.00       75.00         g()
21.43         0.14                 0.03                                                        main
% time:各个函数占用的时间比率(不包括子函数),这一列加起来应该为100%
cumulative seconds:累积时间,当前行减去上一行即为当前函数耗费时间
self seconds:当前函数耗费时间(不包括子函数)
self calls:调用次数
ms/call:调用一次耗费的平均时间(不包括子函数),单位毫秒
total ms/call:同上,但包括子函数
name:函数名

call graph:
granularity: each sample hit covers 4 byte(s) for 7.14% of 0.14 seconds
index      % time    self     children    called        name
                                                                     <spontaneous>
[1]            100.0    0.03       0.11                        main [1]
                             0.04       0.04         1/1           g() [2]
                             0.04       0.00         1/2           f() [3]
-----------------------------------------------
                             0.04       0.04          1/1          main [1]
[2]              53.6    0.04       0.04          1             g() [2]
                             0.04       0.00          1/2          f() [3]
-----------------------------------------------
                             0.04       0.00          1/2          g() [2]
                             0.04       0.00          1/2          main [1]
[3]              50.0    0.07       0.00           2            f() [3]
-----------------------------------------------

每个函数都分配了一个index,index按升序排列,一个函数对应一个entry,两个entry之间用虚线隔开。
在每个entry中,以[index]起头的行称为primary line。primary line上面的行称为caller's line,列举的是调用该函数的函数;下面的行subroutine's line列举的是该函数调用的子函数。这三种line的各项名称虽然相同,但有着截然不同的含义。
以下都以第二个entry为例说明:

primary line
index      % time    self     children    called        name
[2]              53.6    0.04       0.04          1             g() [2]
%time:g()耗费的时间比率。该比率包括了调用的f(),因此各个entry的该项数字加起来不等于100%。
self:同flat table的self seconds。
children:f()耗费的时间。下面的subroutines's line 的self项和children项之和应等于该数值。
called:只被调用了一次。

subroutine's line
index      % time      self       children       called        name
                                0.04       0.00            1/2           f() [3]
self:f()被g()调用过程中,f()的耗费时间0.04s。
children:f()被g()调用过程中,f()中的子函数耗费时间为0。
called:f()一共被调用了2次,其中有1次被g()调用。

caller's line
index      % time      self       children       called        name
                               0.04       0.04            1/1            main [1]
self:g()被main()调用过程中,g()的耗费时间。
children:g()被main()调用过程中,g()中的子函数耗费的时间。
called:g()一共被调用了1次,其中1次是被main()调用的。

gprof的基本原理
类似于gdb,gprof需要对待分析的程序做一些改动,因此在程序编译的时候需要加上"-pg"选项,如果程序的某个模块在编译的时候没有加上"-pg",则该模块的函数会被排除在统计范围之外。比如想要查看库函数的profiling,则需在链接库函数的时候用“-lc_p"代替”-lc"(gprof是各个类UNIX的标准工具,系统自带的链接库通常有两个版本,它们的区别在于编译的时候是否加上了"-pg"。用-lc_p等于告诉编译器选择加上了"-pg"的那个版本)。
加上"-pg"选项后,程序的入口会于main()之前调用monstartup(),主要是申请内存存储接下来获取的统计信息。
在每个函数中会调用mcount(),主要是在函数的堆栈中查询父函数和子函数的地址并保存下来。
最后会在程序退出前调用_mcleanup(),将统计结果保存到gmon.out中,并完成清除工作。
gprof统计各个函数的运行时间是采用的抽样的方法,周期性的查看Program counter指向哪一个函数的地址段,并把结果以直方图的形式保存下来。

PS:
有人建议在编译时不要加上"-g"选项,因为这样可能会影响分析结果。
通常gprof的采样周期是0.01s,统计项越接近这个值误差可能越大。若函数的运行时间低于0.01S,统计值会显示为0。

关于这一主题的有用链接:
http://www.cs.utah.edu/dept/old/texinfo/as/gprof_toc.html:关于options, flat table, call graph有更详细的论述。
http://wiki.waterlin.org/Cpp/gprof.html:对gprof的实现原理论述得很清晰。
http://sam.zoy.org/writings/programming/gprof.html:对多线程profiling。
http://linuxfocus.org/English/March2005/article371.meta.shtml:提到了perl和java的profiling方法。

来自:http://blog.sina.com.cn/s/blog_6608391701013phr.html
Linux查看文件句柄占用多的进程 :

其中第一列是打开的句柄数,第二列是进程ID。
可以根据ID号来查看进程名:

8798 8770 8797 8770 8769 8764 8763 8713 8618 均是PHP的PHP-FPM的句柄数,也就是说第一是virtualBOX,再才是certmonger服务,后是clock-applet,再后是php-fpm进程,这些进程文件数分布排列很正常~
(1)这个没啥用就关了得了:
certmonger 0:关闭 1:关闭 2:关闭 3:关闭 4:关闭 5:关闭 6:关闭
chkconfig certmonger  off
root@119.10.6.54:~# chkconfig certmonger  off
root@119.10.6.54:~# chkconfig --list|grep certmonger
certmonger      0:关闭  1:关闭  2:关闭  3:关闭  4:关闭  5:关闭  6:关闭
root@119.10.6.54:~# service certmonger stop
停止 certmonger:                                          [确定]

重启后按Esc或者F5键,可以查看系统启动过程,卡在哪里,我的是在certmonger启动OK之后卡住的,完全有必要停掉,来源:
http://www.linuxidc.com/Linux/2015-02/112688.htm

(2)/usr/libexec/clock-applet --oaf-activate-iid=OAFIID:GNOME_ClockApplet_Factory --oaf-ior-fd=29
这个好像是gnome的时间同步啥的一个服务,暂时不关。
(1)查看Linux系统默认的最大文件句柄数,系统默认是1024

(3)对服务器没有用的也关了,调节cpu速度用来省电,常用在Laptop上:
service cpuspeed stop
chkconfig cpuspeed off

——————————————————————————————————————————————————
ulimit -n
1024

(2)查看当前进程打开了多少句柄数
lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more
131 24204 
57 24244  
57 24231   ........
其中第一列是打开的句柄数,第二列是进程ID。

(3)可以根据ID号来查看进程名。
ps aef|grep 24204
nginx  24204 24162 99 16:15 ?    00:24:25 /usr/local/nginx/sbin/nginx -s

来自:http://www.examw.com/linux/all/146041/

accept4() failed (24: Too many open files)
如何优化这个
ulimit -n 是多少?
文件描述符不够用了
1024
这个可以开大点
能开多大,如何去衡量啊
内存足够都可以
一般开10万
好的,我看看。
来源:PHP高级编程QQ对话。
=========================================
实践如何找到当面数据库打开了多少个文件句柄数的如下实践:
1)先PS一下获取到Mysql的进程号:
root      4935  0.0  0.0  63992   272 ?        S    Aug06   0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --defaults-file=/usr/local/mysql/conf/my.cnf
mysql     5622  4.5 83.4 14974096 6823984 ?    Sl   Aug06 149:07 /usr/local/mysql/bin/mysqld --defaults-file=/usr/local/mysql/conf/my.cnf --basedir=/usr/local/mysql --datadir=/data/db/mysql --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=/data/db/mysql/localhost.localdomain.err --open-files-limit=65535 --pid-file=/data/db/mysql/localhost.localdomain.pid --socket=/tmp/mysqld.sock --port=3306
2)得到如下两个进程号:
4935
5622

3)通过lsof获取到所有进程的句柄数再grep一下就得到了当前mysql的进程为4935的句柄数:
/usr/sbin/lsof -n|awk '{print $2}'|sort|uniq -c |sort -nr|grep 4935
4 4935
4)一样的方法:
/usr/sbin/lsof -n|awk '{print $2}'|sort|uniq -c |sort -nr|grep 5622
4 5622

目前只打开了4个文件句柄数量,远远底于系统默认值1024。

=========================================
在系统访问高峰时间以root用户执行上面的脚本,可能出现的结果如下:
    # lsof -n|awk '{print $2}'|sort|uniq -c |sort -nr|more    
        131 24204  
         57 24244  
         57 24231  
         56 24264  
其中第一行是打开的文件句柄数量,第二行是进程号。得到进程号后,我们可以通过ps命令得到进程的详细内容。
    ps -aef|grep 24204  
    mysql    24204 24162 99 16:15 ?        00:24:25 /usr/sbin/mysqld  
哦,原来是mysql进程打开最多文件句柄数量。但是他目前只打开了131个文件句柄数量,远远底于系统默认值1024。
但是如果系统并发特别大,尤其是squid服务器,很有可能会超过1024。这时候就必须要调整系统参数,以适应应用变化。Linux有硬性限制和软性限制。可以通过ulimit来设定这两个参数。方法如下,以root用户运行以下命令:
    ulimit -HSn 4096  
以上命令中,H指定了硬性大小,S指定了软性大小,n表示设定单个进程最大的打开文件句柄数量。个人觉得最好不要超过4096,毕竟打开的文件句柄数越多响应时间肯定会越慢。设定句柄数量后,系统重启后,又会恢复默认值。如果想永久保存下来,可以修改.bash_profile文件,可以修改 /etc/profile 把上面命令加到最后。
用普通用户登录,执行ulimit -n,查看文件打开数。
如果太小,默认值是1024,则进行如下操作:
使用root用户修改/etc/ security /limit.conf文件。
在文件最后加如下两句话:
*   soft nofile 50000
*   hard nofile 50000
参考:http://hi.baidu.com/itnote/item/7347bfea829e3ee3fa42bad8
背景:把一个项目代码(里面有.svn)拷贝到另一个文件夹里,用: cp -Rf /home/soruce/* /home/tmp/   发现soruce下面没有.svn,在它的子目录下有。
于是:
用命令 cp /home/soruce/* /home/tmp/
不能拷贝.隐藏文件,cp .*还行。
*为什么不匹配.文件呢,查manual也没有找到答案。

把dira目录中的所有文件(包括隐藏文件)复制到dirb中
正解:cp -a /tmp/dira/. /tmp/dirb
man 一下 cp
-a ,--archive
same as -dpR
实践成功拷贝当前目录的隐藏文件如下:

只拷贝点的隐藏文件的方法:

来自:http://blog.csdn.net/wzwind/article/details/8587764
在“工具-》首选项-》语法”设置函数模式。
其实就是匹配函数的正则表达式。

一:让EditPlus支持PHP5的函数列表:
将函数模式改为:
^[ \t]*[a-z| ]*function[ \t].*\([^;]*$

二:C/C++
默认:^[A-Za-z_].*\([^;]*$  这个匹配还成。
有兄弟说这个,实践感觉好像匹配多了点如else给匹配上了,如下:
^[\t ]*[a-zA-Z]+[\t ]+[a-zA-Z_][a-zA-Z0-9_]*[\t ]*\(.*\)[/t ]*\{?[\t ]*[\r\n$]
[Wed Jul 10 21:12:46.109914 2013] [unique_id:alert] [pid 3870] (EAI 2)Name or service not known: AH01564: unable to find IPv4 address of "jackxiang.localdomain"

添加:
127.0.0.1   jackxiang.localdomain  
    xargs与find经常结合来进行文件操作,平时删日志的时候只是习惯的去删除,比如 # find . -type f -name "*.log" | xargs rm -rf *就将以log结尾的文件删除了,如果我想去移动或者复制就需要使用参数来代替了。 xargs  -i 参数或者-I参数配合{}即可进行文件的操作。 -I replace-str
              Replace  occurrences  of  replace-str  in the initial-arguments with names read from standard input.  Also, unquoted blanks do not terminate
              input items; instead the separator is the newline character.  Implies -x and -L 1.

       --replace[=replace-str], -i[replace-str]
              This option is a synonym for -Ireplace-str if replace-str is specified, and for -I{} otherwise.  This option is deprecated; use -I  instead.
man了一下看的还是不太懂,通过例子,做作实验将我的理解写一下。 ############### 操作的目录下的文件###############[root@test05 ab]# ls
1kk.zip  3kk.zip  5kk.zip  b.rar  d.rar  f.rar  h.rar  j.rar  mini.txt  ni.txt
2kk.zip  4kk.zip  a.rar    c.rar  e.rar  g.rar  i.rar  k.rar  nii.txt###################使用 i 参数 ##################
[root@test05 ab]# find . -type f -name "*.txt" | xargs -i cp {}  /tmp/k/
[root@test05 ab]# ls ../k/
mini.txt  nii.txt  ni.txt
[root@test05 ab]# ###################  使用 I  参数 ################
[root@test05 ab]# find . -type f -name "*.txt" | xargs -I {} cp {}  /tmp/n/
[root@test05 ab]# ls ../n/
mini.txt  nii.txt  ni.txt 结果出来了,  加-i 参数直接用 {}就能代替管道之前的标准输出的内容; 加 -I 参数 需要事先指定替换字符

来自:
http://hi.baidu.com/xmflycat/item/359efb2dbc490799b6326358
---------------------------------------------------------------------------------------------------------------------
如下实践,更容易理解:
查看线程的方法:
          ps -efL, 其中的LWP是线程ID(why是这个), nlwp是线程数.
UID        PID  PPID   LWP  C NLWP STIME TTY          TIME CMD
也就是第四位,是它的线程ID,而第二位则是进程的PID,第三位是子进程号:

查看进程28740是主进程,28741是子进程,28265则是程序的主进程来自:
[root@iZ25dcp92ckZ ~]# ps aux|grep 28265
root     28265  0.0  0.3 116648  3412 pts/0    Ss   21:29   0:00 -bash:
也就是bash终端~





列名分别是:
UID        PID  PPID   LWP  C NLWP STIME TTY          TIME CMD
其中
UID为User ID.
PID为processid,进程标识符
PPID为 parent processid,父进程标识符2,
LWP为light weight process orthread, 轻量级进程,即线程标识符
NLWP为,number oflwps(threads) in the process, 线程的数量

摘自:http://blog.csdn.net/jiafu1115/article/details/19070015

——————————————————————————————————————————————————————
48属于www用户的id,这儿我这个没有添加,所以没有显示www,对上面这些线程进行跟踪:

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

1、 cat /proc/${pid}/status
Threads:        2 //这个是核心,2个线程!如下:
[root@test multepoolserver]# cat /proc/26202/status
Name:   multipepollserv
State:  S (sleeping)
SleepAVG:       58%
Tgid:   26202
Pid:    26202
PPid:   18260
TracerPid:      0
Uid:    0       0       0       0
Gid:    0       0       0       0
FDSize: 256
Groups: 0 1 2 3 4 6 10
VmPeak:    26036 kB
VmSize:    26036 kB
VmLck:         0 kB
VmHWM:      1144 kB
VmRSS:      1144 kB
VmData:    10508 kB
VmStk:        84 kB
VmExe:        16 kB
VmLib:      3052 kB
VmPTE:        80 kB
StaBrk: 03103000 kB
Brk:    03124000 kB
StaStk: 7fff73219100 kB
Threads:        2
SigQ:   1/70656
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 0000000000001000
SigCgt: 0000000180004407
CapInh: 0000000000000000
CapPrm: 00000000fffffeff
CapEff: 00000000fffffeff
Cpus_allowed:   00000000,00000000,00000000,00000000,00000000,00000000,00000000,000000ff
Mems_allowed:   00000000,00000003

2、pstree -p ${pid}
[root@test multepoolserver]# pstree -p 26202
multipepollserv(26202)─┬─multipepollserv(26203)
                       └─{multipepollserv}(26204)

26204 就是一个线程。

[root@test multepoolserver]# ps aux|grep httpmut
root     26202  0.0  0.0  26036  1144 pts/10   Sl+  17:35   0:00 [httpmut: master process] H?????5r%
www      26203  0.0  0.0  15840   468 pts/10   S+   17:35   0:00 [httpmut: worker process] H?????5r%

3、top -p ${pid} 再按H   或者直接输入 top -bH -d 3 -p  ${pid}
[root@test multepoolserver]# top -p 26202
按大写的H(shift+h),就能看到有几个线程:
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
26202 root      18   0 26036 1144  984 S  0.0  0.0   0:00.00 multipepollserv
26204 root      20   0 26036 1144  984 S  0.0  0.0   0:00.00 multipepollserv

top -bH -d 3 -p 26202  //3秒刷新一次
[root@test multepoolserver]# top -bH -d 3 -p 26202
top - 17:39:34 up 650 days,  3:35, 10 users,  load average: 1.04, 1.01, 1.01
Tasks:   2 total,   0 running,   2 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.9%us,  0.3%sy,  0.0%ni, 97.8%id,  0.9%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   8180460k total,  7648040k used,   532420k free,  1269016k buffers
Swap:  8385920k total,   218976k used,  8166944k free,  4855668k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
26202 root      18   0 26036 1144  984 S  0.0  0.0   0:00.00 multipepollserv
26204 root      20   0 26036 1144  984 S  0.0  0.0   0:00.00 multipepollserv

top -H
手册中说:-H : Threads toggle
加上这个选项启动top,top一行显示一个线程。否则,它一行显示一个进程。

4、ps xH
手册中说:H Show threads as if they were processes
这样可以查看所有存在的线程。

5、ps -mp <PID>
手册中说:m Show threads after processes
这样可以查看一个进程起的线程数。
http://liulinxia02.blog.163.com/blog/static/268687720111129103740947/

[root@test multepoolserver]# ps aux|grep httpmut
root     26202  0.0  0.0  26036  1144 pts/10   Sl+  17:35   0:00 [httpmut: master process] H?????5r%
www      26203  0.0  0.0  15840   468 pts/10   S+   17:35   0:00 [httpmut: worker process] H?????5r%
root     26206  0.0  0.0  61172   748 pts/14   S+   17:35   0:00 grep httpmut
[root@test multepoolserver]# ps -mp 26202
  PID TTY          TIME CMD
26202 pts/10   00:00:00 multipepollserv
    - -        00:00:00 -
    - -        00:00:00 -
[root@test multepoolserver]# ps -mp 26203
  PID TTY          TIME CMD
26203 pts/10   00:00:00 multipepollserv
    - -        00:00:00 -







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

在linux中查看线程数的三种方法

在linux中查看线程数的三种方法
  www.2cto.com  
1、top -H
手册中说:-H : Threads toggle
加上这个选项启动top,top一行显示一个线程。否则,它一行显示一个进程。

2、ps xH
手册中说:H Show threads as if they were processes
这样可以查看所有存在的线程。

3、ps -mp <PID>
手册中说:m Show threads after processes

这样可以查看一个进程起的线程数。

来源:http://www.2cto.com/os/201212/177103.html
更多:http://www.360doc.com/content/13/0512/13/9085503_284797175.shtml
VMware虚拟机网络设置为NAT方式,而虚拟机(系统为CentOS)中的默认gateway并不使用VMnet8这块虚拟网卡的IP地址(192.168.38.1),而默认使用的是192.168.38.2,为什么?

真实系统中的vmnet8网卡IP地址是网关,你虚拟机里面的网卡IP地址怎么可能和vmnet8设置的地址一样?

那个虚拟的网卡就是网关,所以你虚拟系统里面的网卡IP地址只能是192.168.38.X,网关要设置成你真实系统里面看到的vmnet8的网卡IP,否则无法上网。

追问:
    你误解了,我是说虚拟机里面的网卡的网关不是vmnet8网卡的ip地址,详细情况为:虚拟机:网卡ip为192.168.38.128,网关为192.168.38.2。主机:vmnet8网卡ip为192.168.38.1我想问的是为什么虚拟机中网卡的网关不为192.168.38.1而为192.168.38.2?

回答:

    你打开你虚拟机安装目录,找到vmnetcfg.exe配置这个文件,然后找到vmnet8,在NAT配置里面也会看到这样一行,默认网关192.168.38.2

    主机网卡IP 192.168.38.1是对外连接的IP,192.168.38.2是LAN网络,就是虚拟机NAT网络的网关,




vmnet8就相当于连接到内网的网卡,而虚拟机本身则相当于运 行在内网上的机器

所以192.168.38.2没错呀。
因为.1被用来连接主机的实际网卡了,所以,网关是:192.168.38.2。

来处:http://wenwen.soso.com/z/q228962597.htm

二:用DHCP上vmware8下进行上网:
设置主机名称与默认网关(通过vi编辑器打开/etc/sysconfig/network文件)

  [root@hostname root]# vi /etc/sysconfig/network

  按照下图设置,注意HOSTNAME这里设置成daquan.wang.com,配置完成后,重启机器后hostname会变成daquan。


设置网卡参数(通过vi编辑器打开/etc/sysconfig/network-scripts/ifcfg-eth0文件)
ONBOOT="yes"      
DEVICE="eth0"    
BOOTPROTO="dhcp"

设置DNS主机的IP(通过vi编辑器打开/etc/resolv.conf文件)

  [root@hostname root]# vi /etc/resolv.conf

  下图无需设置,大家看一下即可,如果不是如下,重新启动机器应该就会自动设置,因为已经设置为DHCP,nameserver会自动设置成VMnet8的Gateway IP Address,nameserver就起到Windows下的DNS Server作用,这种设置类似于Windows域环境下的DNS转发器,说明这个地址会自动转发DNS查询到主机的DNS。

来源 :http://www.linuxeden.com/html/netadmin/20080307/50368.html
上周五临下课时,老师突然问我这两个命令的区别,在看鸟哥的私房菜的时候也没有特别注意这两个命令的不同,毕竟平时经常用的是ifconfig这个命令,虽然ifup ifdown要简单一些,但没怎么用过。仔细查阅资料之后,总结出区别大概如下,关于详细的解释,我也就不在这里搬了,下面是大概的区别,了解linux的人应该能看懂。

    ifconfig :设定网络参数使用的指令
    ifup,ifdown:激活与关闭某个网络适配卡

ifconfig eth0 up 或者是 ifconfig eth0 down 可以使用 ifup eth0 或 ifdown eth0 来替代!,但是 ifup 与 ifdown 是以 /etc/sysconfig/network-scripts/ifcfg-eth[n ](这里的n取0,1,2……)的档案来进行激活的!所以 ifcfg-eth0 必须存在才能使用 ifup/ifdown eth0

也就是说ifup和ifdown必须要有相关的档案存在才能激活呦!举个例子来说,上面我们要激活 eth0 这块网络卡的时候,那么你的 Linux 系统当中就必须要存在 /etc/sysconfig/network-scripts/ifcfg-eth0 这个网络适配卡的设定档案才行!同理可证!如果要激活 eth1 ,除了存在 eth1 这个实体网络卡之外,还要存在 ifcfg-eth1 才行!

而ifconfig eth0 up/down则不需要这两个档案存在。

这也就是ifconfig eth0 up/down与ifup/ifdown eth0的区别!

来自:http://www.muxiaofei.com/ifconfig-eth0-up-down-difference-ifup-and-ifdown-eth0/
大家都认为 Linux 默认是安全的,我大体是认可的 (这是个有争议的话题)。Linux默认确实有内置的安全模型。你需要打开它并且对其进行定制,这样才能得到更安全的系统。Linux更难管理,不过相应也更灵活,有更多的配置选项。

  对于系统管理员,让产品的系统更安全,免于骇客和黑客的攻击,一直是一项挑战。这是我们关于“如何让Linux系统更安全” 或者 “加固Linux系统“之类话题的第一篇文章。本文将介绍 25个有用的技巧和窍门 ,帮助你让Linux系统更加安全。希望下面的这些技巧和窍门可以帮助你加强你的系统的安全。

  1. 物理系统的安全性

  配置BIOS,禁用从CD/DVD、外部设备、软驱启动。下一步,启用BIOS密码,同时启用GRUB的密码保护,这样可以限制对系统的物理访问。

通过设置GRUB密码来保护Linux服务器
  2. 磁盘分区

  使用不同的分区很重要,对于可能得灾难,这可以保证更高的数据安全性。通过划分不同的分区,数据可以进行分组并隔离开来。当意外发生时,只有出问题的分区的数据才会被破坏,其他分区的数据可以保留下来。你最好有以下的分区,并且第三方程序最好安装在单独的文件系统/opt下。

/
/boot
/usr
/var
/home
/tmp
/opt
  3. 最小包安装,最少漏洞

  你真的需要安装所有的服务么?建议不要安装无用的包,避免由这些包带来的漏洞。这将最小化风险,因为一个服务的漏洞可能会危害到其他的服务。找到并去除或者停止不用的服务,把系统漏洞减少到最小。使用‘chkconfig‘命令列出运行级别3的运行所有服务。

# /sbin/chkconfig --list |grep '3:on'
  当你发现一个不需要的服务在运行时,使用下面的命令停止这个服务。

# chkconfig serviceName off
  使用RPM包管理器,例如YUM或者apt-get 工具来列出所有安装的包,并且利用下的命令来卸载他们。

# yum -y remove package-name
# sudo apt-get remove package-name
5 chkconfig Command Examples
20 Practical Examples of RPM Commands
20 Linux YUM Commands for Linux Package Management
25 APT-GET and APT-CACHE Commands to Manage Package Management

  4. 检查网络监听端口

  在网络命令 ‘netstat‘ 的帮助下,你将能够看到所有开启的端口,以及相关的程序。使用我上面提到的 ‘chkconfig‘ 命令关闭系统中不想要的网络服务。

# netstat -tulpn
Linux 网络管理中的 20 条 Netstat 命令
  5. 使用 SSH(Secure Shell)

  Telnet 和 rlogin 协议只能用于纯文本,不能使用加密的格式,这或将导致安全漏洞的产生。SSH 是一种在客户端与服务器端通讯时使用加密技术的安全协议。

  除非必要,永远都不要直接登录 root 账户。使用 “sudo” 执行命令。sudo 由 /etc/sudoers 文件制定,同时也可以使用 “visudo” 工具编辑,它将通过 VI 编辑器打开配置文件。

  同时,建议将默认的 SSH 22 端口号改为其他更高的端口号。打开主要的 SSH 配置文件并做如下修改,以限制用户访问。

# vi /etc/ssh/sshd_config
  关闭 root 用户登录

PermitRootLogin no
  特定用户通过

AllowUsers username
  使用第二版 SSH 协议

Protocol 2
SSH 服务器安全维护五条最佳实践

  6. 保证系统是最新的

  得一直保证系统包含了最新版本的补丁、安全修复和可用内核。

# yum updates
# yum check-update
  7. 锁定 Cron任务

Cron有它自己内建的特性,这特性允许定义哪些人能哪些人不能跑任务。这是通过两个文件/etc/cron.allow 和 /etc/cron.deny 控制的。要锁定在用Cron的用户时可以简单的将其名字写到corn.deny里,而要允许用户跑cron时将其名字加到cron.allow即可。如果你要禁止所有用户使用corn,那么可以将“ALL”作为一行加到cron.deny里。

# echo ALL >>/etc/cron.deny
11 个linux Cron调度实例

  8.  禁止USB探测

很多情况下我们想去限制用户使用USB,来保障系统安全和数据的泄露。建立一个文件‘/etc/modprobe.d/no-usb‘并且利用下面的命令来禁止探测USB存储。

install usb-storage /bin/true
  9.打开SELinux

  SELinux(安全增强linux)是linux内核提供的一个强制的访问控制安全机制。禁用SELinux意味着系统丢掉了安全机制。要去除SELinux之前仔细考虑下,如果你的系统需要发布到网络,并且要在公网访问,你就要更加注意一下。

  SELinux 提供了三个基本的操作模式,他们是:

强制执行:这是默认是模式,用来启用和强制执行SELinux安全措略。
许可模式:这种模式下SELinux不会强制执行安全措略,只有警告和日志记录。这种模式在SELinux相关问题的故障排除时候非常有用。
关闭模式:SELinux被关闭。
  你可以使用命令行‘system-config-selinux‘, ‘getenforce‘ or ‘sestatus‘来浏览当前的SEliux的状态。

# sestatus
  如果是关闭模式,通过下面的命令开启SELinux

# setenforce enforcing
  你也可以通过配置文件‘/etc/selinux/config‘来进行SELinux的开关操作。

  10. 移除KDE或GNOME桌面

  没必要在专用的LAMP服务器上运行X Window桌面比如KDE和GNOME。可以移掉或关闭它们,以提高系统安全性和性能。打开/etc/inittab然后将run level改成3就可以关闭这些桌面。如果你将它彻底的从系统中移走,可以用下面这个命令:

# yum groupremove "X Window System"
  11. 关闭IPv6

  如果不用IPv6协议,那就应该关闭掉它,因为大部分的应用和策略都不会用到IPv6,而且当前它不是服务器必需的。可以在网络配置文件中加入如下几行来关掉它。

# vi /etc/sysconfig/network
NETWORKING_IPV6=no
IPV6INIT=no
  12. 限制用户使用旧密码

  如果你不希望用户继续使用老密码,这一条很有用。老的密码文件位于 /etc/security/opasswd。你可以使用 PAM 模块实现。

  RHEL / CentOS / Fedora 中打开 ‘/etc/pam.d/system-auth‘ 文件。

# vi /etc/pam.d/system-auth
  Ubuntu/Debian/Linux Mint 中打开 ‘/etc/pam.d/common-password‘ 文件。

# vi /etc/pam.d/common-password
  在 ‘auth‘ 块中添加下面一行。

auth        sufficient    pam_unix.so likeauth nullok
  在 ‘password‘ 块添加下面一行,禁止用户重新使用其过去最后用过的 5个密码。

password   sufficient    pam_unix.so nullok use_authtok md5 shadow remember=5
  服务器只记录最后的 5 个密码。如果你试图使用曾用的最后 5个老密码中的任意一个,你将看到如下的错误提示。

Password has been already used. Choose another.
  13. 如何检查用户密码过期?

  在 Linux 中,用户的密码以加密的形式保存在 ‘/etc/shadow‘ 文件中。要检查用户的密码是否过期,你需要使用 ‘chage‘ 命令。它将显示密码的最后修改日期及密码期限的细节信息。这些细节就是系统决定用户是否必须修改其密码的依据。

  要查看任一存在用户的老化信息,如 过期日 和 时长,使用如下命令。

#chage -l username
  要修改任一用户的密码老化,使用如下命令。

#chage -M 60 username
#chage -M 60 -m 7 -W 7 userName
  参数

-M 设置天数最大数字
-m 设定天数最小数字
-W 设定想要的天数
  14. 手动锁定或解锁用户账号

  锁定和解锁功能是非常有用的,你可以锁定一个账号一周或一个月,而不是将这个账号从系统中剔除。可以用下面这个命令锁定一个特定用户。

# passwd -l accountName
  提示:这个被锁定的用户仅对root用户仍然可见。这个锁定是通过将加密过的密码替换成(!)来实现的。如果有个想用这个账号来进入系统,他会得到类似下面这个错误的提示。

# su - accountName
This account is currently not available.
  解锁一个被锁定的账号时,用下面这个命令。这命令会将被替换成(!)的密码改回来。

# passwd -u accountName
  15. 增强密码

  有相当数量的用户使用很弱智的密码,他们的密码都可以通过字典攻击或者暴力攻击攻破。‘pam_cracklib‘模块存于在PAM 中,它可以强制用户设置复杂的密码。通过编辑器打开下面的文件。

# vi /etc/pam.d/system-auth
  在文件中增加一行,使用认证参数(lcredit, ucredit, dcredit  或者 ocredit 对应小写字母、大写字母,数字和其他字符)

/lib/security/$ISA/pam_cracklib.so retry=3 minlen=8 lcredit=-1 ucredit=-2 dcredit=-2 ocredit=-1
  16. 启用Iptable(防火墙)

  高度推荐启用linux防火墙来禁止非法程序访问。使用iptable的规则来过滤入站、出站和转发的包。我们可以针对来源和目的地址进行特定udp/tcp端口的准许和拒绝访问。

Basic IPTables Guide and Tips
  17. 禁止Ctrl+Alt+Delete重启

  在大多数的linux发行版中,按下‘CTRL-ALT-DELETE’将会让你的系统重启。只说生产服务器上这是不是一个很好的做法,这可能导致误操作。

  这个配置是在‘ /etc/inittab‘文件,如果你打开这个文件,你可以看到下面类似的段落。默认的行已经被注释掉了。我们必须注释掉他。这个特定按键会让系统重启。

# Trap CTRL-ALT-DELETE
#ca::ctrlaltdel:/sbin/shutdown -t3 -r now
  18. 检查空密码帐号

  任何空密码的账户意味这可以让Web上任何无授权的用户访问,这是linux服务器的一个安全威胁。所以,确定所有的用户拥有一个复杂的密码并且不存在特权用户。空密码帐号是安全风险,可以被轻易的攻克。可以利用下面的命令来检查是否有空密码账户存在。

# cat /etc/shadow | awk -F: '($2==""){print $1}'
  19. 登录前显示SSH提示

  在ssh认证时候,使用一个法律和安全警示是很好的建议。关于SSH警示可以看下面的文章。

Display SSH Warning Message to Users

  20. 监视用户行为

  如果你有很多的用户,去收集每一个用户的行为和和他们的进程消耗的信息非常重要。可以随后和一些性能优化和安全问题处理时进行用户分析。但是如果监视和搜集用户行为信息呢 ?

  有两个很有用的工具‘psacct‘ 和 ‘acct‘可以用来监视系统中用户的行为和进程。这些工具在系统后台执行并且不断记录系统中每一个用户的行为和各个服务比如Apache, MySQL, SSH, FTP, 等的资源消耗。对这些工具更多的安装配置和使用信息,请访问下面的网址:

Monitor User Activity with psacct or acct Commands

  21. 定期查看日志

  将日志移动到专用的日志服务器里,这可避免入侵者轻易的改动本地日志。下面是常见linux的默认日志文件及其用处:

/var/log/message – 记录系统日志或当前活动日志。
/var/log/auth.log – 身份认证日志。
/var/log/kern.log – 内核日志。
/var/log/cron.log – Crond 日志 (cron 任务).
/var/log/maillog – 邮件服务器日志。
/var/log/boot.log – 系统启动日志。
/var/log/mysqld.log – MySQL数据库服务器日志。
/var/log/secure – 认证日志。
/var/log/utmp or /var/log/wtmp :登录日志。
/var/log/yum.log: Yum 日志。
  22. 重要文件备份

  在生产环境里,为了灾难恢复,有必要将重要文件备份并保存在安全的远程磁带保险库、远程站点或异地硬盘。

  23. NIC 绑定

  有两种类型的NIC绑定模式,需要在绑定接口用得到。

mode=0 – 循环赛模式
mode=1 – 激活和备份模式
  NIC绑定可以帮助我们避免单点失败。在NIC绑定中,我们把两个或者更多的网卡绑定到一起,提供一个虚拟的接口,这个接口设置ip地址,并且和其他服务器会话。这样在一个NIC卡down掉或者由于其他原因不能使用的时候,我们的网络将能保持可用。

  相关阅读 : Create NIC Channel Bonding in Linux

  24. 保持 /boot 只读

  linux内核和他的相关的文件都保存在/boot目下,默认情况下是可以读写的。把它设为了只读可以减少一些由于非法修改重要boot文件而导致的风险。

# vi /etc/fstab
  在文件最后增加下面的行,并且保存

LABEL=/boot     /boot     ext2     defaults,ro     1 2
  如果你今后需要升级内核的话,你需要修回到读写模式。

  25.不鸟ICMP和Broadcast请求

  在/etc/sysctl.conf中添加下面几行,屏蔽掉ping和broadcast请求。

Ignore ICMP request:
net.ipv4.icmp_echo_ignore_all = 1

Ignore Broadcast request:
net.ipv4.icmp_echo_ignore_broadcasts = 1
  运行下面这一行加载修改或更新

#sysctl -p
  如果你觉得了上述安全小贴士很好用,或还有什么其它需要补充进去,请在下面的评论框里写写,不断追求进步的TecMint一如既往地愿意听到您的评论、建议以及讨论。

来自:http://www.admin10000.com/document/2273.html
背景:
  在Linux上或windows上有时接口调用时需要有一个延时(模拟和真实访问一样),于是在windows下和linux下都需要要这样的延时函数。

Windows下延时两秒示例:



Linux下延时两秒示例:
usleep - sleep some number of microseconds 它微妙:


Linux平台延时之sleep、usleep、nanosleep、select比较:
sleep的精度是秒
usleep的精度是微妙,不精确
select的精度是微妙,精确
struct timeval delay;
delay.tv_sec = 0;
delay.tv_usec = 20 * 1000; // 20 ms
select(0, NULL, NULL, NULL, &delay);

nanosleep的精度是纳秒,不精确
unix、linux系统尽量不要使用usleep和sleep而应该使用nanosleep,使用nanosleep应注意判断返回值和错误代码,否则容易造成cpu占用率100%。
上面提到usleep和nanosleep不精确的实验,参见这里:http://www.lslnet.com/linux/dosc1/18/linux-188816.htm
摘自:http://www.cppblog.com/kongque/archive/2011/01/18/138765.aspx
  一般在/etc/security/limits.conf 中修改最大打开文件数和进程数,如:
    * soft noproc 102400
    * hard noproc 102400
    * soft nofile 102400
    * hard nofile 102400
    但是在centos 6.3下,方法不一样了
    首先在/etc/security/limits.conf中修改最大文件数和进程数
    *   soft   nofile   102400
    
    *   hard  nofile   102400
  
    然后在/etc/security/limits.d/90-nproc.conf中修改最大文件数和进程数
    *   soft   nproc   102400
    *   hard  nproc   102400
  

阅读全文
为了vim更好的支持python写代码,修改tab默认4个空格有两种设置方法:

1. vim /etc/vimrc
set ts=4
set sw=4

举个例子,在多人一起开发项目时,为了使代码风格尽量保持一致,一般不允许在代码使用TAB符,而以4个空格代之。我们可以编辑一个文件,包含下面的内容:
set shiftwidth=4
set expandtab

然后把下面的命令加入到.vimrc中:
autocmd FileType c,cpp set shiftwidth=4 | set expandtab

就可以只在编辑c和cpp文件时实行这种设置了

http://blog.sina.com.cn/s/blog_6f3d37ff0101aat6.html
===========================================
vim显示空格,及tab字符 vim 多行注释(转)
1、显示 TAB 键

文件中有 TAB 键的时候,你是看不见的。要把它显示出来:

:set list

现在 TAB 键显示为 ^I,而 $显示在每行的结尾,以便你能找到可能会被你忽略的空白字符在哪里。
这样做的一个缺点是在有很多 TAB 的时候看起来很丑。如果你使用一个有颜色的终端,或者使用 GUI 模式,Vim 可以用高亮显示空格和TAB。
使用 ‘listchars’ 选项:

:set listchars=tab:>-,trail:-

现在,TAB会被显示成 ">—" 而行尾多余的空白字符显示成 "-"。看起来好多了,是吧?

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

2、让vim显示行尾的空格

fedora 9系统下
在/etc/vimrc文件添加如下两行
highlight WhitespaceEOL ctermbg=red guibg=red
match WhitespaceEOL /\s\+$/

实践证明在centos下的/root/.vimrc里加上也OK,行尾空格变红。-add:2014-10-09

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

http://www.cnblogs.com/chenwenbiao/archive/2011/10/26/2225467.html
分页: 17/22 第一页 上页 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 下页 最后页 [ 显示模式: 摘要 | 列表 ]