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,第三位是子进程号:


ps -T -p 9613
  PID  SPID TTY          TIME CMD
9613  9613 pts/1    00:00:00 thread01
9613  9712 pts/1    00:00:00 thread01
9613  9795 pts/1    00:00:00 thread01
9613  9853 pts/1    00:00:00 thread01

看线程PID:
ps -efL|grep logstash|awk '{print $4}'|wc
    148     148     888

查看进程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
背景:Apache结合spawn-fcgi使用FastCGI的实践,和PHP启动fastCGI一个原理。
关于PHP的相关情况参考:使用spawn-fcgi管理运行php-cgi  Url: http://www.libaqiang.com/?p=78193

spawn-fcgi和nginx自带的fastcgi相比 有什么优势?
为什么在用nginx的时候还要装spawn-fcgi,nginx不是自带有这个模块吗?
nginx的fastcgi_pass模块是用于代理fcgi协议的后端。spawn-fcgi用于管理支持fcgi协议的进程,属于process manager这类,免于重造轮子。
对于PHP,推荐php-fpm,比spawn多了不少专门针对php的功能,例如slow_request等。
http://www.zhihu.com/question/19689162


一)这个用spawn-fcgi 来管理FastCGI 以达到优化Apache 下PHP性能的方法比较另类,大家权当一种参考。

方法:系统平台是CentOS 5,前提是LAMP已配置好,运行正常。

1. wget -c http://www.21andy.com/centos/5/i386/spawn-fcgi-1.6.3-1.el5.i386.rpm(也可以去官方下载源码包编译安装:http://www.lighttpd.net/download/spawn-fcgi-1.6.3.tar.gz)
2. rpm -ivh spawn-fcgi-1.6.3-1.el5.i386.rpm
3. 使用spawn-fcgi来控制php-cgi的FastCGI进程:
/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -C 5 -u apache -g apache -f /usr/bin/php-cgi

参数含义如下:
-f <fcgiapp> 指定调用FastCGI的进程的执行程序位置,根据系统上所装的PHP的情况具体设置。
-a <addr> 绑定到地址addr。
-p <port> 绑定到端口port。
-s <path> 绑定到unix socket的路径path。
-C <childs> 指定产生的FastCGI的进程数,默认为5。(仅用于PHP)
-P <path> 指定产生的进程的PID文件路径。
-u和-g FastCGI使用什么身份(-u 用户 -g 用户组)运行,CentOS下可以使用apache用户,其他的根据情况配置,如nobody、www-data等。
4. 将这行代码加入到/etc/rc.local文件底部,这样系统启动的时候就可以同时启动PHP的FastCGI进程。


实践内容:
实践来源:http://www.phpabc.cn/apachejie-he-spawn-fcgishi-yong-fastcgi.html
(1)通过spawn-fcgi来启动php进程
/usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi  -a 127.0.0.1 -p 9000 -C 5 -u apache -g www -f /usr/local/webserver/php/bin/php-cgi          
spawn-fcgi: child spawned successfully: PID: 7551

ps aux|grep php
apache    7551 16.7  1.6  43396  6016 ?        Ssl  15:14   0:01 /usr/local/webserver/php/bin/php-cgi

cd lighttpd_fastCGI_Codes/
./configure && make && make install
/usr/bin/install -c spawn-fcgi '/usr/local/bin'
启动PHP:
/usr/local/bin/spawn-fcgi  -a 127.0.0.1 -p 9000 -C 5 -u apache -g www -f /usr/local/webserver/php/bin/php-cgi
root@192.168.137.128:~/software/lighttpd_fastCGI_Codes# ps aux|grep php  //共5个
www       9754  4.0  2.4  45112  8588 ?        Ss   15:50   0:00 /usr/local/webserver/php/bin/php-cgi
www       9756  0.0  1.1  45112  3988 ?        S    15:50   0:00 /usr/local/webserver/php/bin/php-cgi
www       9757  0.0  1.1  45112  3988 ?        S    15:50   0:00 /usr/local/webserver/php/bin/php-cgi

(2)要是自己编写一个fastcgi呢?简单如下操作(这儿好像不能像PHP一样有多个进程:fastcgi 多进程这部分,我还没研究到。可以有空再看看):
代码编写:
vi hello.c


编译:
gcc -o hello.fcgi hello.c -L /usr/local/webserver/fastcgi/fcgi/lib -lfcgi
/usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi  -a 127.0.0.1 -p 9000 -C 5 -u apache -g www -f ./hello.fcgi

启动成功没:
root@192.168.137.128:/usr/local/test# ps aux|grep hello
apache   10485  0.0  0.1   2140   416 ?        Ss   16:31   0:00 ./hello.fcgi

至于后面的ngnx配置,无非两种:
一个是直接连sock,另一个是开9002端口两者对比效率上哪个高一点儿呢?
一般来说本地的 unix sock要快一些。


参考Url:
http://blog.csdn.net/qzier_go/article/details/7340868
http://terry831010.blog.163.com/blog/static/6916117120126185428827/

二)spawn-fcgi与fcgi的运行机制分析 :在此基础上实现了守护监控功能
http://blog.csdn.net/cleanfield/article/details/6412723


背景:
群里有兄弟在问:
我在PHP.ini里 display=off屏蔽了错误,然后把错误信息 写入到LOG里
怎么搞?
一)
set_exception_handler
set_error_handler
二)php.ini里配置:
log_errors = On
error_log = /data/logs/php_error.log

阅读全文
背景:
Weibo LAMP演变——提到这zend的optimizer+快,大约在7 ~ 10% 快于APC。
阅读全文
古文言文:故智者不能谋,因形而措胜于众,众不能知,人皆知我所以胜之形,而莫知吾所以制胜之形.如何解释?

人皆知我所以胜之形,而莫知吾所以制胜之形
出自《孙子兵法》
所以,示形诱敌的方法运用得极其巧妙时,可达到不漏蛛丝马迹一点破绽也没有的地步。到此境地,即使隐藏再深的间谍也不能探明我军虚实,智慧高超的对手也想不出对付我的办法。根据敌情采取制胜的策略,即使摆在众人面前,众人也理解不了。人们知道我克敌制胜的方法,却不知道我是怎样运用这些方法制胜的。


孙子曰:故形人而我无形,则我专而敌分。我专为一,敌分为十,是以十攻其一也,后十则围之,五则攻之,倍则分之,敌则能战之,不若则能避之,人皆知我所以胜之形 而莫知吾所以制胜之形。如:大公司业务太多了,每周开例会,某些部门的业务可能排不到前 10 名讨论。大公司内部也有勾心斗角,倾轧,像电影里面一样,他们互相不支援。一个大公司看起来钱多,人多,但是因为公司大了,所以更不敢赌。我们兄弟伙最大的优势就是团队虽然小,但如果只干一件事,只干一个产品,只干一个功能,调动所有的人力,就能做到极致。
明朝那些事儿有讲,很精彩,鸣梁海战电影观看:
http://www.kuaifangba.com/moive/zhangzheng/minglianghaizhan/
摘自:http://www.techweb.com.cn/ucweb/news/id/2113438
===========================================================================
出自《孙子兵法·虚实篇》。原文如下:
孙子曰:
凡先处战地而待敌者佚,后处战地而趋战者劳。故善战者,致人而不致于人。
能使敌人自至者,利之也;能使敌人不得至者,害之也。故敌佚能劳之,饱能饥之
,安能动之。出其所必趋,趋其所不意。
行千里而不劳者,行于无人之地也;攻而必取者,攻其所不守也。守而必固者
,守其所必攻也。故善攻者,敌不知其所守;善守者,敌不知其所攻。微乎微乎,
至于无形;神乎神乎,至于无声,故能为敌之司命。进而不可御者,冲其虚也;退
而不可追者,速而不可及也。故我欲战,敌虽高垒深沟,不得不与我战者,攻其所
必救也;我不欲战,虽画地而守之,敌不得与我战者,乖其所之也。故形人而我无
形,则我专而敌分。我专为一,敌分为十,是以十攻其一也。则我众敌寡,能以众
击寡者,则吾之所与战者约矣。吾所与战之地不可知,不可知则敌所备者多,敌所
备者多,则吾所与战者寡矣。故备前则后寡,备后则前寡,备左则右寡,备右则左
寡,无所不备,则无所不寡。寡者,备人者也;众者,使人备己者也。故知战之地
,知战之日,则可千里而会战;不知战之地,不知战日,则左不能救右,右不能救
左,前不能救后,后不能救前,而况远者数十里,近者数里乎!
以吾度之,越人之兵虽多,亦奚益于胜哉!
故曰:胜可为也。敌虽众,可使无斗。故策之而知得失之计,候之而知动静之
理,形之而知死生之地,角之而知有余不足之处。故形兵之极,至于无形。无形则
深间不能窥,智者不能谋。因形而措胜于众,众不能知。人皆知我所以胜之形,而
莫知吾所以制胜之形。故其战胜不复,而应形于无穷。
夫兵形象水,水之行避高而趋下,兵之形避实而击虚;水因地而制流,兵因敌
而制胜。故兵无常势,水无常形。能因敌变化而取胜者,谓之神。故五行无常胜,
四时无常位,日有短长,月有死生。
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/

阿里云启动网卡:
cat ifcfg-eth0
cat ifcfg-eth1

ifup eth1
ifup eth0
相比Win下的调试书籍,linux下的相关书,至少在国内几乎没有见过。 想是因为win下的破解带动了调试这块吧。。。。
  
   以前尝试过直接去翻GDB的manual,但是十分枯燥,看不下去。因为只是直接介绍命令而已,对于初学者,事实上需要的是实例,和能够一步步能操演下去的讲解。这本书很薄,但是基本的调试用法都讲到了,普通的程序调试应该是足够了。这本书让我觉得调试也是非常有意思的一件事,并勾起了我对于底层硬件探究的兴趣。

DownLoad:
http://ishare.iask.sina.com.cn/f/22493308.html?from=like
阅读全文
背景:
          群发邮件后出现一个兄弟收到两封邮件,于是邮件的兄弟要看邮件头,OutLook2010没有那个玩意。
阅读全文
大家都认为 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
矩阵键盘是单片机编程中所使用的键盘.
1.矩阵式键盘的结构与工作原理
  在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式,如图1所示。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如P1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。
  矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,上图中,列线通过电阻接正电源,并将行线所接的单片机的I/O口作为输出端,而列线所接的I/O口则作为输入。这样,当按键没有按下时,所有的输出端都是高电平,代表无键按下。行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。具体的识别及编程方法如下所述。

  2、矩阵式键盘的按键识别方法
  确定矩阵式键盘上何键被按下介绍一种“行扫描法”。
  行扫描法 行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法,如上图所示键盘,介绍过程如下。
  1、判断键盘中有无键按下 将全部行线Y0-Y3置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。若所有列线均为高电平,则键盘中无键按下。
  2、判断闭合键所在的位置 在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。
  下面给出一个具体的例子:
  图仍如上所示。8031单片机的P1口用作键盘I/O口,键盘的列线接到P1口的低4位,键盘的行线接到P1口的高4位。列线P1.0-P1.3分别接有4个上拉电阻到正电源+5V,并把列线P1.0-P1.3设置为输入线,行线P1.4-P.17设置为输出线。4根行线和4根列线形成16个相交点。
  1、检测当前是否有键被按下。检测的方法是P1.4-P1.7输出全“0”,读取P1.0-P1.3的状态,若P1.0-P1.3为全“1”,则无键闭合,否则有键闭合。
  2、去除键抖动。当检测到有键按下后,延时一段时间再做下一步的检测判断。
  3、若有键被按下,应识别出是哪一个键闭合。方法是对键盘的行线进行扫描。P1.4-P1.7按下述4种组合依次输出:
   P1.7 1 1 1 0
   P1.6 1 1 0 1
   P1.5 1 0 1 1
   P1.4 0 1 1 1
  在每组行输出时读取P1.0-P1.3,若全为“1”,则表示为“0”这一行没有键闭合,否则有键闭合。由此得到闭合键的行值和列值,然后可采用计算法或查表法将闭合键的行值和列值转换成所定义的键值
  4、为了保证键每闭合一次CPU仅作一次处理,必须却除键释放时的抖动。

  键盘扫描程序:
  从以上分析得到键盘扫描程序的流程图如图2所示。程序如下
SCAN: MOV P1,#0FH
MOV A,P1
ANL A,#0FH
CJNE A,#0FH,NEXT1
SJMP NEXT3
NEXT1: ACALL D20MS
MOV A,#0EFH
NEXT2: MOV R1,A
MOV P1,A
MOV A,P1
ANL A,#0FH
CJNE A,#0FH,KCODE;
MOV A,R1
SETB C
RLC A
JC NEXT2
NEXT3: MOV R0,#00H
RET
KCODE: MOV B,#0FBH
NEXT4: RRC A
INC B
JC NEXT4
MOV A,R1
SWAP A
NEXT5: RRC A
INC B
INC B
INC B
INC B
JC NEXT5
NEXT6: MOV A,P1
ANL A,#0FH
CJNE A,#0FH,NEXT6
MOV R0,#0FFH
RET
  键盘处理程序就作这么一个简单的介绍,实际上,键盘、显示处理是很复杂的,它往往占到一个应用程序的大部份代码,可见其重要性,但说到,这种复杂并不来自于单片机的本身,而是来自于操作者的习惯等等问题,因此,在编写键盘处理程序之前,最好先把它从逻辑上理清,然后用适当的算法表示出来,最后再去写代码,这样,才能快速有效地写好代码。
  键盘是由一组规则排列的按键组成,一个按键实际上是一个开关元件,也就是说键盘是一组规则排列的开关。

    键盘工作原理

    1.按键的分类
按键按照结构原理可分为两类,一类是触点式开关按键,如机械式开关、导电橡胶式开关等;另一类是无触点开关按键,如电气式按键,磁感应按键等。前者造价低,后者寿命长。目前,微机系统中最常见的是触点式开关按键。
按键按照接口原理可分为编码键盘与非编码键盘两类,这两类键盘的主要区别是识别键符及给出相应键码的方法。编码键盘主要是用硬件来实现对键的识别,非编码键盘主要是由软件来实现键盘的定义与识别。
全编码键盘能够由硬件逻辑自动提供与键对应的编码,此外,一般还具有去抖动和多键、窜键保护电路,这种键盘使用方便,但需要较多的硬件,价格较贵,一般的单片机应用系统较少采用。非编码键盘只简单地提供行和列的矩阵,其它工作均由软件完成。由于其经济实用,较多地应用于单片机系统中。下面将重点介绍非编码键盘接口。
2.键输入原理
在单片机应用系统中,除了复位按键有专门的复位电路及专一的复位功能外,其它按键都是以开关状态来设置控制功能或输入数据。当所设置的功能键或数字键按下时,计算机应用系统应完成该按键所设定的功能,键信息输入是与软件结构密切相关的过程。
    对于一组键或一个键盘,总有一个接口电路与CPU相连。CPU可以采用查询或中断方式了解有无将键输入并检查是哪一个键按下,将该键号送入累加器ACC,然后通过跳转指令转入执行该键的功能程序,执行完后再返回主程序。
3.按键结构与特点
微机键盘通常使用机械触点式按键开关,其主要功能是把机械上的通断转换成为电气上的逻辑关系。也就是说,它能提供标准的TTL逻辑电平,以便与通用数字系统的逻辑电平相容。
机械式按键再按下或释放时,由于机械弹性作用的影响,通常伴随有一定时间的触点机械抖动,然后其触点才稳定下来。其抖动过程如图7.2所示,抖动时间的长短与开关的机械特性有关,一般为5~10ms。

左图  按键触点的机械抖动
在触点抖动期间检测按键的通与断状态,可能导致判断出错。即按键一次按下或释放被错误地认为是多次操作,这种情况是不允许出现的。为了克服按键触点机械抖动所致的检测误判,必须采取去抖动措施,可从硬件、软件两方面予以考虑。在键数较少时,可采用硬件去抖,而当键数较多时,采用软件去抖。
在硬件上可采用在键输出端加R-S触发器(双稳态触发器)或单稳态触发器构成去抖动电路,图7.3是一种由R-S触发器构成的去抖动电路,当触发器一旦翻转,触点抖动不会对其产生任何影响。
电路工作过程如下:按键未按下时,a = 0,b = 1,输出Q = 1,按键按下时,因按键的机械弹性作用的影响,使按键产生抖动,当开关没有稳定到达b端时,因与非门2输出为0反馈到与非门1的输入端,封锁了与非门1,双稳态电路的状态不会改变,输出保持为1,输出Q不会产生抖动的波形。当开关稳定到达b端时,因a = 1,b = 0,使Q = 0,双稳态电路状态发生翻转。当释放按键时,在开关未稳定到达a端时,因Q = 0,封锁了与非门2,双稳态电路的状态不变,输出Q保持不变,消除了后沿的抖动波形。当开关稳定到达b端时,因a = 0,b = 0,使Q = 1,双稳态电路状态发生翻转,输出Q重新返回原状态。由此             右图 双稳态去抖电路
可见,键盘输出经双稳态电路之后,输出已变为规范的矩形方波。
软件上采取的措施是:在检测到有按键按下时,执行一个10ms左右(具体时间应视所使用的按键进行调整)的延时程序后,再确认该键电平是否仍保持闭合状态电平,若仍保持闭合状态电平,则确认该键处于闭合状态;同理,在检测到该键释放后,也应采用相同的步骤进行确认,从而可消除抖动的影响。
    4.按键编码
一组按键或键盘都要通过I/O口线查询按键的开关状态。根据键盘结构的不同,采用不同的编码。无论有无编码,以及采用什么编码,最后都要转换成为与累加器中数值相对应的键值,以实现按键功能程序的跳转。
5.编制键盘程序
一个完善的键盘控制程序应具备以下功能:
(1)检测有无按键按下,并采取硬件或软件措施,消除键盘按键机械触点抖动的影响。
(2)有可靠的逻辑处理办法。每次只处理一个按键,其间对任何按键的操作对系统不产生影响,且无论一次按键时间有多长,系统仅执行一次按键功能程序。
(3)准确输出按键值(或键号),以满足跳转指令要求。

    独立式按键
   
单片机控制系统中,往往只需要几个功能键,此时,可采用独立式按键结构。
1.独立式按键结构
独立式按键是直接用I/O口线构成的单个按键电路,其特点是每个按键单独占用一根I/O         
               左图   独立式按键电路


口线,每个按键的工作不会影响其它I/O口线的状态。独立式按键的典型应用如图7.4所示。
独立式按键电路配置灵活,软件结构简单,但每个按键必须占用一根I/O口线,因此,在按键较多时,I/O口线浪费较大,不宜采用。
图7.4中按键输入均采用低电平有效,此外,上拉电阻保证了按键断开时,I/O口线有确定的高电平。当I/O口线内部有上拉电阻时,外电路可不接上拉电阻。
2.独立式按键的软件结构
独立式按键软件常采用查询式结构。先逐位查询每根I/O口线的输入状态,如某一根I/O口线输入为低电平,则可确认该I/O口线所对应的按键已按下,然后,再转向该键的功能处理程序。图7.4中的I/O口采用P1口,请读者自行编制相应的软件。
7.1.3  矩阵式按键
单片机系统中,若使按键较多时,通常采用矩阵式(也称行列式)键盘。
1.矩阵式键盘的结构及原理
矩阵式键盘由行线和列线组成,按键位于行、列线的交叉点上,其结构如下图所示。                                          

由图可知,一个4×4的行、列结构可以构成一个含有16个按键的键盘,显然,在按键数量较多时,矩阵式键盘较之独立式按键键盘要节省很多I/O口。
矩阵式键盘中,行、列线分别连接到按键开关的两端,行线通过上拉电阻接到+5V上。当无键按下时,行线处于高电平状态;当有键按下时,行、列线将导通,此时,行线电平将由与此行线相连的列线电平决定。这是识别按键是否按下的关键。然而,矩阵键盘中的行线、列线和多个键相连,各按键按下与否均影响该键所在行线和列线的电平,各按键间将相互影响,因此,必须将行线、列线信号配合起来作适当处理,才能确定闭合键的位置。
2.矩阵式键盘按键的识别
识别按键的方法很多,其中,最常见的方法是扫描法。下面以图7.5中8号键的识别为例来说明扫描法识别按键的过程。
    按键按下时,与此键相连的行线与列线导通,行线在无键按下时处在高电平,显然,如果让所有的列线也处在高电平,那么,按键按下与否不会引起行线电平的变化,因此,必须使所有列线处在低电平,只有这样,当有键按下时,该键所在的行电平才会由高电平变为低电平。CPU根据行电平的变化,便能判定相应的行有键按下。8号键按下时,第2行一定为低电平,然而,第2行为低电平时,能否肯定是8号键按下呢?回答是否定的,因为9、10、11号键按下同样使第2行为低电平。为进一步确定具体键,不能使所有列线在同一时刻都处在低电平,可在某一时刻只让一条列线处于低电平,其余列线均处于高电平,另一时刻,让下一列处在低电平,依此循环,这种依次轮流每次选通一列的工作方式称为键盘扫描。采用键盘扫描后,再来观察8号键按下时的工作过程,当第0列处于低电平时,第2行处于低电平,而第1、2、3列处于低电平时,第2行却处在高电平,由此可判定按下的键应是第2行与第0列的交叉点,即8号键。
    3.键盘的编码
对于独立式按键键盘,因按键数量少,可根据实际需要灵活编码。对于矩阵式键盘,按键的位置由行号和列号唯一确定,因此可分别对行号和列号进行二进制编码,然后将两值合成一个字节,高4位是行号,低4位是列号。如图7.5中的8号键,它位于第2行,第0列,因此,其键盘编码应为20H。采用上述编码对于不同行的键离散性较大,不利于散转指令对按键进行处理。因此,可采用依次排列键号的方式对安排进行编码。以图7.5中的4×4键盘为例,可将键号编码为:01H、02H、03H…0EH、0FH、10H等16个键号。编码相互转换可通过计算或查表的方法实现。
4.键盘的工作方式
在单片机应用系统中,键盘扫描只是CPU的工作内容之一。CPU对键盘的响应取决于键盘的工作方式,键盘的工作方式应根据实际应用系统中CPU的工作状况而定,其选取的原则是既要保证CPU能及时响应按键操作,又不要过多占用CPU的工作时间。通常,键盘的工作方式有三种,即编程扫描、定时扫描和中断扫描。
    1)编程扫描方式
编程扫描方式是利用CPU完成其它工作的空余调用键盘扫描子程序来响应键盘输入的要求。在执行键功能程序时,CPU不再响应键输入要求,直到CPU重新扫描键盘为止。
键盘扫描程序一般应包括以下内容:
(1)判别有无键按下。
(2)键盘扫描取得闭合键的行、列值。
(3)用计算法或查表法得到键值。
(4)判断闭合键是否释放,如没释放则继续等待。
(5)将闭合键键号保存,同时转去执行该闭合键的功能。
背景:
  在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
lsof -n|awk '{print $2}'|sort|uniq -c|sort -nr|more
其中第一列是打开的句柄数,第二列是进程ID。可以根据ID号来查看进程名:
ps aef|grep 24204

是当前生效还是全局,http://www.linuxde.net/2013/03/13045.html

分析这段代码可以知道先读/etc/security/limits.conf,如果/etc/security/limits.d/目录下还有配置文件的话,也读进来,一起分析。这就意味/etc/security/limits.d/里面的文件里面的配置会覆盖/etc/security/limits.conf的配置。


  一般在/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
  

阅读全文
分页: 88/339 第一页 上页 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 下页 最后页 [ 显示模式: 摘要 | 列表 ]