2016年11月

linux shell数组建立及使用技巧

linux shell在编程方面比windows 批处理强大太多,无论是在循环、运算。已经数据类型方面都是不能比较的。 下面是个人在使用时候,对它在数组方面一些操作进行的总结。

1.数组定义
[chengmo@centos5 ~]$ a=(1 2 3 4 5)
[chengmo@centos5 ~]$ echo $a
1

一对括号表示是数组,数组元素用“空格”符号分割开。

2.数组读取与赋值

得到长度:

[chengmo@centos5 ~]$ echo ${#a[@]}
5

用${#数组名[@或*]} 可以得到数组长度
读取:

[chengmo@centos5 ~]$ echo ${a[2]} 
3
[chengmo@centos5 ~]$ echo ${a[*]} 
1 2 3 4 5

用${数组名[下标]} 下标是从0开始 下标是:*或者@ 得到整个数组内容
赋值:

[chengmo@centos5 ~]$ a[1]=100
[chengmo@centos5 ~]$ echo ${a[*]} 
1 100 3 4 5

[chengmo@centos5 ~]$ a[5]=100     
[chengmo@centos5 ~]$ echo ${a[*]}
1 100 3 4 5 100

直接通过 数组名[下标] 就可以对其进行引用赋值,如果下标不存在,自动添加新一个数组元素
删除:

[chengmo@centos5 ~]$ a=(1 2 3 4 5)
[chengmo@centos5 ~]$ unset a
[chengmo@centos5 ~]$ echo ${a[*]}
[chengmo@centos5 ~]$ a=(1 2 3 4 5)
[chengmo@centos5 ~]$ unset a[1]   
[chengmo@centos5 ~]$ echo ${a[*]} 
1 3 4 5
[chengmo@centos5 ~]$ echo ${#a[*]}
4

直接通过:unset 数组[下标] 可以清除相应的元素,不带下标,清除整个数据。

3.特殊使用

分片:

[chengmo@centos5 ~]$ a=(1 2 3 4 5)
[chengmo@centos5 ~]$ echo ${a[@]:0:3}
1 2 3
[chengmo@centos5 ~]$ echo ${a[@]:1:4}
2 3 4 5
[chengmo@centos5 ~]$ c=(${a[@]:1:4})
[chengmo@centos5 ~]$ echo ${#c[@]}
4
[chengmo@centos5 ~]$ echo ${c[*]} 
2 3 4 5

直接通过 ${数组名[@或*]:起始位置:长度} 切片原先数组,返回是字符串,中间用“空格”分开,因此如果加上”()”,将得到切片数组,上面例子:c 就是一个新数据。
替换:

[chengmo@centos5 ~]$ a=(1 2 3 4 5)    
[chengmo@centos5 ~]$ echo ${a[@]/3/100}
1 2 100 4 5
[chengmo@centos5 ~]$ echo ${a[@]}
1 2 3 4 5
[chengmo@centos5 ~]$ a=(${a[@]/3/100}) 
[chengmo@centos5 ~]$ echo ${a[@]}     
1 2 100 4 5

调用方法是:${数组名[@或*]/查找字符/替换字符} 该操作不会改变原先数组内容,如果需要修改,可以看上面例子,重新定义数据。
从上面讲到的,大家可以发现linux shell 的数组已经很强大了,常见的操作已经绰绰有余了。

转载http://www.cnblogs.com/chengmo/archive/2010/09/30/1839632.html

shell 按行读取并保存成数组

从ip.txt里读取IP.然后把IP地址赋值到一个数组里.
IP文件如下:

Address:  220.181.26.163
Address:  220.181.26.174
Address:  220.181.26.175
Address:  220.181.26.176
Address:  220.181.19.228
Address:  220.181.19.229
Address:  220.181.26.161
Address:  220.181.26.162

方法一:

for x in ` awk '{print $2}' ip.txt `
{
echo $x
}

方法二:

ARRAY=($(awk '{print $2}' ip.txt))

方法三:

i=0;while read line;do a[$i]=`echo $line | cut -f2 -d ' '`;i=$i+1;done < ip.txt

方法四:

#!/bin/bash
i=1;
LINES=`cat ip.txt | wc -l`;
#while [ ${i} -le ${LINES} ];
while (( ${i} <= ${LINES} ))
do
        echo `cat ip.txt | sed -n "${i}p" | awk -F" " '{print $2}'`;
        #i=$[${i}+1];
        #((i+=1));
        i=`expr ${i} + 1`;
done;

数组实用示例
1、从“标准输入”读入n次字符串,每次输入的字符串保存在数组array里

#!/bin/bash
i=0;
l=5;
arr=();
while [ ${i} -lt ${l} ];
do
        echo "Please input...\n";
        read arr[$i];
        echo ${arr[@]};
        ((i+=1));
done;

2、将字符串里的字母逐个放入数组,并输出到“标准输出”

#!/bin/bash
chars='asdasdacvcxbvfgtbfghn';
LENGTH=${#chars};
for ((i=0;i<${LENGTH};i++));
do
        echo "${chars:${i}:1}";
done;

这里有趣的地方是 ${chars:$i:1},表示从chars字符串的 $i 位置开始,获取 1 个字符。如果将 1 改为 3 ,就获取 3 个字符啦~ 结果是:

abc
bcd
...
vxy
xyz
yz     //没有足够字符串获取了
z      //没有足够字符串获取了
3、将数组应用到shell环境变量(2) 【这个用法不错!给原作者赞一个!】

使用tr命令将文件中的回车转换成空格:
[root@pps ~]# cat /etc/shells | tr "\n" " " > /tmp/tmp.file

将文件中内容给数组赋值:(碰到第一个回车符之前的内容)
[root@pps ~]# read -a SHELLS < /tmp/tmp.file

查看数组赋值情况:
[root@pps ~]# set | grep "SHELLS"
SHELLS=([0]="/bin/sh" [1]="/bin/bash" [2]="/sbin/nologin" [3]="/bin/tcsh" [4]="/bin/csh" [5]="/bin/ksh")

后面可以将这个数组环境变量应用到其它的SHELL脚本或者应用程序里了~

linux screen 命令详解

一、背景

系统管理员经常需要SSH 或者telent 远程登录到Linux 服务器,经常运行一些需要很长时间才能完成的任务,比如系统备份、ftp 传输等等。通常情况下我们都是为每一个这样的任务开一个远程终端窗口,因为它们执行的时间太长了。必须等待它们执行完毕,在此期间不能关掉窗口或者断开连接,否则这个任务就会被杀掉,一切半途而废了。

二、简介

GNU Screen是一款由GNU计划开发的用于命令行终端切换的自由软件。用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换。

GNU Screen可以看作是窗口管理器的命令行界面版本。它提供了统一的管理多个会话的界面和相应的功能。

会话恢复
只要Screen本身没有终止,在其内部运行的会话都可以恢复。这一点对于远程登录的用户特别有用——即使网络连接中断,用户也不会失去对已经打开的命令行会话的控制。只要再次登录到主机上执行screen -r就可以恢复会话的运行。同样在暂时离开的时候,也可以执行分离命令detach,在保证里面的程序正常运行的情况下让Screen挂起(切换到后台)。这一点和图形界面下的VNC很相似。
多窗口
在Screen环境下,所有的会话都独立的运行,并拥有各自的编号、输入、输出和窗口缓存。用户可以通过快捷键在不同的窗口下切换,并可以自由的重定向各个窗口的输入和输出。Screen实现了基本的文本操作,如复制粘贴等;还提供了类似滚动条的功能,可以查看窗口状况的历史记录。窗口还可以被分区和命名,还可以监视后台窗口的活动。
会话共享
Screen可以让一个或多个用户从不同终端多次登录一个会话,并共享会话的所有特性(比如可以看到完全相同的输出)。它同时提供了窗口访问权限的机制,可以对窗口进行密码保护。
GNU's Screen 官方站点:http://www.gnu.org/software/screen/

三、语法

# screen [-AmRvx -ls -wipe][-d <作业名称>][-h <行数>][-r <作业名称>][-s ][-S <作业名称>]
参数说明
参数 说明
-A  将所有的视窗都调整为目前终端机的大小。
-d <作业名称>  将指定的screen作业离线。
-h <行数>   指定视窗的缓冲区行数。
-m   即使目前已在作业中的screen作业,仍强制建立新的screen作业。
-r <作业名称>  恢复离线的screen作业。
-R   先试图恢复离线的作业。若找不到离线的作业,即建立新的screen作业。
-s  指定建立新视窗时,所要执行的shell。
-S <作业名称>  指定screen作业的名称。
-v  显示版本信息。
-x   恢复之前离线的screen作业。
-ls或--list  显示目前所有的screen作业。
-wipe  检查目前所有的screen作业,并删除已经无法使用的screen作业。

四、常用screen参数

screen -S yourname -> 新建一个叫yourname的session
screen -ls -> 列出当前所有的session
screen -r yourname -> 回到yourname这个session
screen -d yourname -> 远程detach某个session
screen -d -r yourname -> 结束当前session并回到yourname这个session
在每个screen session 下,所有命令都以 ctrl+a(C-a) 开始。
按键 说明
C-a ? 显示所有键绑定信息
C-a c 创建一个新的运行shell的窗口并切换到该窗口
C-a n Next,切换到下一个 window
C-a p Previous,切换到前一个 window
C-a 0..9 切换到第 0..9 个 window
Ctrl+a [Space] 由视窗0循序切换到视窗9
C-a C-a 在两个最近使用的 window 间切换
C-a x 锁住当前的 window,需用用户密码解锁
C-a d detach,暂时离开当前session,将目前的 screen session (可能含有多个 windows) 丢到后台执行,并会回到还没进 screen 时的状态,此时在 screen session 里,每个 window 内运行的 process (无论是前台/后台)都在继续执行,即使 logout 也不影响。
C-a z 把当前session放到后台执行,用 shell 的 fg 命令则可回去。
C-a w 显示所有窗口列表
C-a t Time,显示当前时间,和系统的 load
C-a k kill window,强行关闭当前的 window
C-a [ 进入 copy mode,在 copy mode 下可以回滚、搜索、复制就像用使用 vi 一样
C-a ] Paste,把刚刚在 copy mode 选定的内容贴上
copy模式快捷键
按键 说明
C-b Backward,PageUp
C-f Forward,PageDown
H(大写) High,将光标移至左上角
L Low,将光标移至左下角
0 移到行首
$ 行末
w forward one word,以字为单位往前移
b backward one word,以字为单位往后移
Space 第一次按为标记区起点,第二次按为终点
Esc 结束 copy mode

五、使用 screen

5.1 安装screen

流行的Linux发行版(例如Red Hat Enterprise Linux)通常会自带screen实用程序,如果没有的话,可以从GNU screen的官方网站下载。

[root@TS-DEV ~]# yum install screen
[root@TS-DEV ~]# rpm -qa|grep screen
screen-4.0.3-4.el5
[root@TS-DEV ~]#
5.2 创建一个新的窗口

安装完成后,直接敲命令screen就可以启动它。但是这样启动的screen会话没有名字,实践上推荐为每个screen会话取一个名字,方便分辨:

[root@TS-DEV ~]# screen -S david 

screen启动后,会创建第一个窗口,也就是窗口No. 0,并在其中打开一个系统默认的shell,一般都会是bash。所以你敲入命令screen之后,会立刻又返回到命令提示符,仿佛什么也没有发生似的,其实你已经进入Screen的世界了。当然,也可以在screen命令之后加入你喜欢的参数,使之直接打开你指定的程序,例如:

[root@TS-DEV ~]# screen vi david.txt

screen创建一个执行vi david.txt的单窗口会话,退出vi 将退出该窗口/会话。

5.3 查看窗口和窗口名称

打开多个窗口后,可以使用快捷键C-a w列出当前所有窗口。如果使用文本终端,这个列表会列在屏幕左下角,如果使用X环境下的终端模拟器,这个列表会列在标题栏里。窗口列表的样子一般是这样:

0$ bash  1-$ bash  2*$ bash  

这个例子中我开启了三个窗口,其中*号表示当前位于窗口2,-号表示上一次切换窗口时位于窗口1。

Screen默认会为窗口命名为编号和窗口中运行程序名的组合,上面的例子中窗口都是默认名字。练习了上面查看窗口的方法,你可能就希望各个窗口可以有不同的名字以方便区分了。可以使用快捷键C-a A来为当前窗口重命名,按下快捷键后,Screen会允许你为当前窗口输入新的名字,回车确认。

5.4 会话分离与恢复

你可以不中断screen窗口中程序的运行而暂时断开(detach)screen会话,并在随后时间重新连接(attach)该会话,重新控制各窗口中运行的程序。例如,我们打开一个screen窗口编辑/tmp/david.txt文件:

[root@TS-DEV ~]# screen vi /tmp/david.txt

之后我们想暂时退出做点别的事情,比如出去散散步,那么在screen窗口键入C-a d,Screen会给出detached提示:

暂时中断会话

半个小时之后回来了,找到该screen会话:

[root@TS-DEV ~]# screen -ls

重新连接会话:

[root@TS-DEV ~]# screen -r 12865

一切都在。

当然,如果你在另一台机器上没有分离一个Screen会话,就无从恢复会话了。

这时可以使用下面命令强制将这个会话从它所在的终端分离,转移到新的终端上来:

5.5 清除dead 会话

如果由于某种原因其中一个会话死掉了(例如人为杀掉该会话),这时screen -list会显示该会话为dead状态。使用screen -wipe命令清除该会话:

5.6 关闭或杀死窗口

正常情况下,当你退出一个窗口中最后一个程序(通常是bash)后,这个窗口就关闭了。另一个关闭窗口的方法是使用C-a k,这个快捷键杀死当前的窗口,同时也将杀死这个窗口中正在运行的进程。

如果一个Screen会话中最后一个窗口被关闭了,那么整个Screen会话也就退出了,screen进程会被终止。

除了依次退出/杀死当前Screen会话中所有窗口这种方法之外,还可以使用快捷键C-a :,然后输入quit命令退出Screen会话。需要注意的是,这样退出会杀死所有窗口并退出其中运行的所有程序。其实C-a :这个快捷键允许用户直接输入的命令有很多,包括分屏可以输入split等,这也是实现Screen功能的一个途径,不过个人认为还是快捷键比较方便些。

六、screen 高级应用

6.1 会话共享

还有一种比较好玩的会话恢复,可以实现会话共享。假设你在和朋友在不同地点以相同用户登录一台机器,然后你创建一个screen会话,你朋友可以在他的终端上命令:

[root@TS-DEV ~]# screen -x

这个命令会将你朋友的终端Attach到你的Screen会话上,并且你的终端不会被Detach。这样你就可以和朋友共享同一个会话了,如果你们当前又处于同一个窗口,那就相当于坐在同一个显示器前面,你的操作会同步演示给你朋友,你朋友的操作也会同步演示给你。当然,如果你们切换到这个会话的不同窗口中去,那还是可以分别进行不同的操作的。

6.2 会话锁定与解锁

Screen允许使用快捷键C-a s锁定会话。锁定以后,再进行任何输入屏幕都不会再有反应了。但是要注意虽然屏幕上看不到反应,但你的输入都会被Screen中的进程接收到。快捷键C-a q可以解锁一个会话。

也可以使用C-a x锁定会话,不同的是这样锁定之后,会话会被Screen所属用户的密码保护,需要输入密码才能继续访问这个会话。

6.3 发送命令到screen会话

在Screen会话之外,可以通过screen命令操作一个Screen会话,这也为使用Screen作为脚本程序增加了便利。关于Screen在脚本中的应用超出了入门的范围,这里只看一个例子,体会一下在会话之外对Screen的操作:

[root@TS-DEV ~]# screen -S sandy -X screen ping www.baidu.com

这个命令在一个叫做sandy的screen会话中创建一个新窗口,并在其中运行ping命令。

6.4 屏幕分割

现在显示器那么大,将一个屏幕分割成不同区域显示不同的Screen窗口显然是个很酷的事情。可以使用快捷键C-a S将显示器水平分割,Screen 4.00.03版本以后,也支持垂直分屏,快捷键是C-a |。分屏以后,可以使用C-a 在各个区块间切换,每一区块上都可以创建窗口并在其中运行进程。

可以用C-a X快捷键关闭当前焦点所在的屏幕区块,也可以用C-a Q关闭除当前区块之外其他的所有区块。关闭的区块中的窗口并不会关闭,还可以通过窗口切换找到它。

6.5 C/P模式和操作

screen的另一个很强大的功能就是可以在不同窗口之间进行复制粘贴了。使用快捷键C-a 或者C-a [可以进入copy/paste模式,这个模式下可以像在vi中一样移动光标,并可以使用空格键设置标记。其实在这个模式下有很多类似vi的操作,譬如使用/进行搜索,使用y快速标记一行,使用w快速标记一个单词等。关于C/P模式下的高级操作,其文档的这一部分有比较详细的说明。

一般情况下,可以移动光标到指定位置,按下空格设置一个开头标记,然后移动光标到结尾位置,按下空格设置第二个标记,同时会将两个标记之间的部分储存在copy/paste buffer中,并退出copy/paste模式。在正常模式下,可以使用快捷键C-a ]将储存在buffer中的内容粘贴到当前窗口。

6.6 更多screen功能

同大多数UNIX程序一样,GNU Screen提供了丰富强大的定制功能。你可以在Screen的默认两级配置文件/etc/screenrc和$HOME/.screenrc中指定更多,例如设定screen选项,定制绑定键,设定screen会话自启动窗口,启用多用户模式,定制用户访问权限控制等等。如果你愿意的话,也可以自己指定screen配置文件。

以多用户功能为例,screen默认是以单用户模式运行的,你需要在配置文件中指定multiuser on 来打开多用户模式,通过acl*(acladd,acldel,aclchg...)命令,你可以灵活配置其他用户访问你的screen会话。更多配置文件内容请参考screen的man页。

定制bash环境

定义bash环境之前,首先需要明白bash配置文件加载的顺序

执行顺序为: /etc/profile -> (~/.bash_profile | ~/.bash_login | ~/.profile) -> ~/.bashrc -> /etc/bashrc -> ~/.bash_logout

各个文件的作用域

(1) /etc/profile: 此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行. 并从/etc/profile.d目录的配置文件中搜集shell的设置。

(2) /etc/bashrc: 为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取(即每次新开一个终端,都会执行bashrc)。

(3) ~/.bash_profile: 每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次。默认情况下,设置一些环境变量,执行用户的.bashrc文件。

(4) ~/.bashrc: 该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取。

(5) ~/.bash_logout: 当每次退出系统(退出bash shell)时,执行该文件. 另外,/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承 /etc/profile中的变量,他们是"父子"关系。

(6) ~/.bash_profile: 是交互式、login 方式进入 bash 运行的~/.bashrc 是交互式 non-login 方式进入 bash 运行的通常二者设置大致相同,所以通常前者会调用后者。

定制PATH变量,PATH变量是在执行命令的时候系统所会去搜寻的目录,在上面的配置文件中加上对PATH变量的设置,注意,不要被覆盖
例子:

export PATH=$PATH:$HOME/mybin

定制PS1,这个变量为命令行前的提示符
......省略

定制linux库文件的所有的位置
LD_LIBRARY_PATH

使用 ln 给命令创建软连接

ln -s source target

使用alias给命令取别名

[root@iZ23e5fkkhxZ ~]# alias supervi=vim

对服务器中的进程进行管理

查看当前在后台执行的命令

[root@iZ23e5fkkhxZ ~]# jobs 
[1]+  Stopped                 vim aaa

让任务在后台运行

[root@iZ23e5fkkhxZ ~]# bg %1
[1]+ vim aaa &

把后台的任务拿到前台来运行

[root@iZ23e5fkkhxZ ~]# bg %1
[1]+ vim aaa &

把命令放到后台执行,可以使用&符号,但是单纯使用这个命令的话,在当前会话链接结束之后,这个命令的执行也会结束

[root@iZ23e5fkkhxZ ~]# ls &
[1] 30847

在命令执行的时候Ctrl + z可以把命令的执行放在后台,但是任务是停止的状态

nohup 命令和 & 符号的结合使用可以使命令在后台执行,并且不会受当前回话断开的影响

[root@iZ23e5fkkhxZ ~]# nohup grep -lr jin /home/xx.xxx.xxx/public_html &
[1] 30969
[root@iZ23e5fkkhxZ ~]# nohup: ignoring input and appending output to `nohup.out'

使用screen命令,screen命令需要单独安装

# 输入screen命令进入screen
[root@iZ23e5fkkhxZ ~]# screen
# 执行需要的命令
[root@iZ23e5fkkhxZ ~]# grep -lr jin /home/xx.xxx.xxx/public_html &
# Ctrl + a 然后加d,就可以保存当前的screen
[detached]
# 查看后台的screen的信息
[root@iZ23e5fkkhxZ ~]# screen -ls
There is a screen on:
    31371.pts-3.iZ23e5fkkhxZ    (Detached)
1 Socket in /var/run/screen/S-jtcm.
# 回到screen
[root@iZ23e5fkkhxZ ~]# screen -r 31371

linux检测服务运行状态

查看硬盘使用情况

查看所有的磁盘的信息

block用完和inode用完都会导致系统出现问题

[root@jin ~]# fdisk -l

Disk /dev/sda: 136.4 GB, 136365211648 bytes
255 heads, 63 sectors/track, 16578 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
Disk identifier: 0x000d203d

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *           1          26      204800   83  Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2              26        6400    51200000   83  Linux
/dev/sda3            6400       12774    51200000   83  Linux
/dev/sda4           12774       16579    30563328    5  Extended
/dev/sda5           12774       13029     2048000   82  Linux swap / Solaris
/dev/sda6           13030       16579    28513280   83  Linux
查看已mount的磁盘
显示block使用情况
[root@jin ~]# df
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/sda2       50264772 3597620  44107152   8% /
tmpfs            1957328       0   1957328   0% /dev/shm
/dev/sda1         194241   49660    134341  27% /boot
/dev/sda3       50264772   53088  47651684   1% /home
/dev/sda6       27934740  329028  26180048   2% /var
以1024为单位,显示block使用情况
[root@jin ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2        48G  3.5G   43G   8% /
tmpfs           1.9G     0  1.9G   0% /dev/shm
/dev/sda1       190M   49M  132M  27% /boot
/dev/sda3        48G   52M   46G   1% /home
/dev/sda6        27G  322M   25G   2% /var
以1000为单位,显示block使用情况
[root@jin ~]# df -H
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2        52G  3.7G   46G   8% /
tmpfs           2.1G     0  2.1G   0% /dev/shm
/dev/sda1       199M   51M  138M  27% /boot
/dev/sda3        52G   55M   49G   1% /home
/dev/sda6        29G  337M   27G   2% /var
显示inode使用情况
[root@jin ~]# df -i
Filesystem      Inodes  IUsed   IFree IUse% Mounted on
/dev/sda2      3203072 113580 3089492    4% /
tmpfs           489332      1  489331    1% /dev/shm
/dev/sda1        51200     44   51156    1% /boot
/dev/sda3      3203072     17 3203055    1% /home
/dev/sda6      1782368   2033 1780335    1% /var

查看服务器的CPU使用率,内存使用,虚拟内存交换情况,IO读写情况

找出对系统的瓶颈是因为哪一部份产生的

vmstat命令
[root@jin ~]# vmstat 1 2#每一秒采集一次服务器状态,采集2次
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  0      0 2877720  65744 240040    0    0     0     0   18   17  0  0 100  0  0  
 0  0      0 2877688  65744 240040    0    0     0     0  106   68  0  0 100  0  0
r 表示运行队列(就是说多少个进程真的分配到CPU),我测试的服务器目前CPU比较空闲,没什么程序在跑,当这个值超过了CPU数目,就会出现CPU瓶颈了。这个也和top的负载有关系,一般负载超过了3就比较高,超过了5就高,超过了10就不正常了,服务器的状态很危险。top的负载类似每秒的运行队列。如果运行队列过大,表示你的CPU很繁忙,一般会造成CPU使用率很高。
b 表示阻塞的进程,这个不多说,进程阻塞,大家懂的。
swpd 虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。
free 空闲的物理内存的大小,我的机器内存总共8G,剩余3415M。
buff Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存,我本机大概占用300多M
cache cache直接用来记忆我们打开的文件,给文件做缓冲,我本机大概占用300多M(这里是Linux/Unix的聪明之处,把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了提高 程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。)
si 每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。我的机器内存充裕,一切正常。
so 每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。
bi 块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte,我本机上没什么IO操作,所以一直是0,但是我曾在处理拷贝大量数据(2-3T)的机器上看过可以达到140000/s,磁盘写入速度差不多140M每秒
bo 块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。
in 每秒CPU的中断次数,包括时间中断
cs 每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。
us 用户CPU时间,我曾经在一个做加密解密很频繁的服务器上,可以看到us接近100,r运行队列达到80(机器在做压力测试,性能表现不佳)。
sy 系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。
id 空闲 CPU时间,一般来说,id + us + sy = 100,一般我认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。
wt 等待IO CPU时间。
free命令查看内存使用
[root@jin ~]# free
             total       used       free     shared    buffers     cached
Mem:       3914656    1036920    2877736        196      65744     240040
-/+ buffers/cache:     731136    3183520
Swap:      2047996          0    2047996
[root@jin ~]# free -h
             total       used       free     shared    buffers     cached
Mem:          3.7G       1.0G       2.7G       196K        64M       234M
-/+ buffers/cache:       714M       3.0G
Swap:         2.0G         0B       2.0G
在文件/proc/meminfo中查看
[root@jin ~]# cat /proc/meminfo
top命令查看系统状态

参考 http://jinblog.com/archives/722.html

查看系统程序

找出占用过多资源的程序
使用ps命令,参考 http://jinblog.com/archives/728.html

查看网络

查看是否机器有过多的网络连接
使用netstat命令查看

[root@jin ~]# netstat -atlunp
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address               Foreign Address             State       PID/Program name   
tcp        0      0 127.0.0.1:9000              0.0.0.0:*                   LISTEN      1811/php-fpm        
tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN      3428/nginx          
tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      1202/sshd           
tcp        0      0 127.0.0.1:9000              127.0.0.1:36446             TIME_WAIT   -                   
tcp        0      0 192.168.1.99:80             192.168.1.62:56513          ESTABLISHED 3429/nginx          
tcp        0      0 192.168.1.99:80             192.168.1.62:56514          ESTABLISHED 3429/nginx          
tcp        0      0 192.168.1.99:80             192.168.1.62:56515          ESTABLISHED 3429/nginx          
tcp        0      0 127.0.0.1:9000              127.0.0.1:36452             TIME_WAIT   -                   
tcp        0      0 192.168.1.99:80             192.168.1.62:56512          ESTABLISHED 3429/nginx          
tcp        0      0 127.0.0.1:9000              127.0.0.1:36448             TIME_WAIT   -                   
tcp        0      0 127.0.0.1:9000              127.0.0.1:36442             TIME_WAIT   -                   
tcp        0      0 127.0.0.1:9000              127.0.0.1:36468             TIME_WAIT   -                   
tcp        0      0 192.168.1.99:80             192.168.1.62:56516          ESTABLISHED 3429/nginx          
tcp        0      0 192.168.1.99:80             192.168.1.62:56511          ESTABLISHED 3429/nginx          
tcp        0      0 192.168.1.99:22             192.168.1.62:53375          ESTABLISHED 3482/sshd           
tcp        0      0 127.0.0.1:9000              127.0.0.1:36454             TIME_WAIT   -                   
tcp        0      0 127.0.0.1:9000              127.0.0.1:36450             TIME_WAIT   -                   
tcp        0      0 127.0.0.1:9000              127.0.0.1:36470             TIME_WAIT   -                   
tcp        0      0 :::3306                     :::*                        LISTEN      2920/mysqld         
tcp        0      0 :::22                       :::*                        LISTEN      1202/sshd           
tcp        0      0 ::ffff:127.0.0.1:3306       ::ffff:127.0.0.1:50626      TIME_WAIT   -                   
tcp        0      0 ::ffff:127.0.0.1:3306       ::ffff:127.0.0.1:50598      TIME_WAIT   -                   
tcp        0      0 ::ffff:127.0.0.1:3306       ::ffff:127.0.0.1:50610      TIME_WAIT   -                   
tcp        0      0 ::ffff:127.0.0.1:3306       ::ffff:127.0.0.1:50616      TIME_WAIT   -                   
tcp        0      0 ::ffff:127.0.0.1:3306       ::ffff:127.0.0.1:50618      TIME_WAIT   -                   
tcp        0      0 ::ffff:127.0.0.1:3306       ::ffff:127.0.0.1:50614      TIME_WAIT   -                   
tcp        0      0 ::ffff:127.0.0.1:3306       ::ffff:127.0.0.1:50628      TIME_WAIT   -                   
tcp        0      0 ::ffff:127.0.0.1:3306       ::ffff:127.0.0.1:50612      TIME_WAIT   -

查看系统默认启动的服务

使用chkconfig查看个管理默认启动的服务