第十三课时预习笔记

使用w查看系统负载

第十三课时预习笔记_第1张图片
使用w查看系统负载详解使用w查看系统负载详解

相信所有的linux管理员最常用的命令就是这个 w 了,该命令显示的信息还是蛮丰富的。第一行从左面开始显示的信息依次为:时间,系统运行时间,登录用户数,平均负载。第二行开始以及下面所有的行,告诉我们的信息是,当前登录的都有哪些用户,以及他们是从哪里登录的等等。其实,在这些信息当中,我们最应该关注的应该是第一行中的 ‘load average:’ 后面的三个数值。

第一个数值表示1分钟内系统的平均负载值;第二个数值表示5分钟内系统的平均负载值;第三个数值表示15分钟系统的平均负载值。这个值的意义是,单位时间段内CPU活动进程数。当然这个值越大就说明服务器压力越大。一般情况下这个值只要不超过服务器的cpu数量就没有关系,如果服务器cpu数量为8,那么这个值若小于8,就说明当前服务器没有压力,否则就要关注一下了。那么如何查看服务器有几个cpu?

第十三课时预习笔记_第2张图片

‘/proc/cpuinfo’ 这个文件记录了cpu的详细信息。目前市面上的服务器通常都是2颗4核cpu,在linux看来,它就是8个cpu。查看这个文件时则会显示8段类似的信息,而最后一段信息中processor : 后面跟的是 ‘7’ 所以查看当前系统有几个cpu,我们可以使用这个命令: grep -c 'processor' /proc/cpuinfo 而如何看几颗物理cpu呢,需要查看关键字 “physical id”, 由于此虚拟机只有一个cpu所以并未显示关于 “physical id” 的信息。

 vmstat命令

使用w查看系统负载详解使用w查看系统负载详解

上面讲的 w 查看的是系统整体上的负载,通过看那个数值可以知道当前系统有没有压力,但是具体是哪里(CPU, 内存,磁盘等)有压力就无法判断了。通过 vmstat 就可以知道具体是哪里有压力。vmstat命令打印的结果共分为6部分:procs, memory, swap, io, system, cpu. 请重点关注一下r b si so bi bo几列。

1)procs 显示进程相关信息

r :表示运行和等待cpu时间片的进程数,如果长期大于服务器cpu的个数,则说明cpu不够用了;

b :表示等待资源的进程数,比如等待I/O, 内存等,这列的值如果长时间大于1,则需要关注一下了;

2)memory 内存相关信息

swpd :表示切换到交换分区中的内存数量 ;

free :当前空闲的内存数量;

buff :缓冲大小,(即将写入磁盘的);

cache :缓存大小,(从磁盘中读取的);

3)swap 内存交换情况

si :由交换区写入到内存的数据量;

so :由内存写入到交换区的数据量;

4)io 磁盘使用情况

bi :从块设备读取数据的量(读磁盘);

bo: 从块设备写入数据的量(写磁盘);

bi bo上5千 就应该注意了

5)system 显示采集间隔内发生的中断次数

in :表示在某一时间间隔中观测到的每秒设备中断数;

cs :表示每秒产生的上下文切换次数;

6)CPU 显示cpu的使用状态

us :显示了用户下所花费 cpu 时间的百分比;

sy :显示系统花费cpu时间百分比;

id :表示cpu处于空闲状态的时间百分比;

wa :表示I/O等待所占用cpu时间百分比;

st :表示被偷走的cpu所占百分比(一般都为0,不用关注);

以上所介绍的各个参数中,常常会关注r列,b列,和wa列,三列代表的含义在上边说得已经很清楚。IO部分的bi以及bo也是要经常参考的对象。如果磁盘io压力很大时,这两列的数值会比较高。另外当si, so两列的数值比较高,并且在不断变化时,说明内存不够了,内存中的数据频繁交换到交换分区中,这往往对系统性能影响极大。

我们使用 vmstat 查看系统状态的时候,通常都是使用这样的形式来看的:

[root@localhost ~]# vmstat 1 5

or

[root@localhost ~]# vmstat 1

前面表示,每隔一秒钟打印一次状态,共打印5次,而后面的表示每隔1秒打印一次状态,一直打印,除非我们按 Ctrl + c 结束

top命令

第十三课时预习笔记_第3张图片

这个命令用于动态监控进程所占系统资源,每隔3秒变一次。这个命令的特点是把占用系统资源(CPU,内存,磁盘IO等)最高的进程放到最前面。top命令打印出了很多信息,包括系统负载(loadaverage)、进程数(Tasks)、cpu使用情况、内存使用情况以及交换分区使用情况。其实上面这些内容可以通过其他命令来查看,所以用top重点查看的还是下面的进程使用系统资源详细状况。这部分东西反映的东西还是比较多的,不过需要关注的也就是几项:%CPU, %MEM, COMMAND,RES 这一项为进程所占内存大小,而 %MEM 为使用内存百分比。在 top 状态下,按 “shift + m”, 可以按照内存使用大小排序。按数字 ‘1’ 可以列出各颗cpu的使用状态。

另外,经常用的一个命令 top -bn1 它表示非动态打印系统资源使用情况,可以用在shell脚本中:

第十三课时预习笔记_第4张图片

和 top 命令唯一的区别就是,它一次性全部把所有信息输出出来而非动态显示。

sar命令

sar 命令很强大,它可以监控系统所有资源状态,比如平均负载、网卡流量、磁盘状态、内存使用等等。它不同于其他系统状态监控工具的地方在于,它可以打印历史信息,可以显示当天从零点开始到当前时刻的系统状态信息。如果系统没有安装这个命令,请使用 yum install -y sysstat 命令安装。初次使用sar命令会报错,那是因为sar工具还没有生成相应的数据库文件(时时监控就不会了,因为不用去查询那个库文件)。它的数据库文件在 “/var/log/sa/” 目录下,默认保存一个月。

1)查看网卡流量历史 sar -n DEV 以及时时查看网卡流量 sar -n DEV 1 5

IFACE这列表示设备名称,rxpck/s 表示每秒进入收取的包的数量,txpck/s 表示每秒发送出去的包的数量,rxbyt/s 表示每秒收取的数据量(单位Byte),txbyt/s表示每秒发送的数据量。后面几列不需要关注。如果有一天所管理的服务器丢包非常严重,那么就应该看一看这个网卡流量是否异常了,如果rxpck/s 那一列的数值大于4000,或者rxbyt/s那列大于5,000,000则很有可能是被攻击了,正常的服务器网卡流量不会高于这么多,除非是自己在拷贝数据。

使用w查看系统负载详解使用w查看系统负载详解

第十三课时预习笔记_第5张图片

另外也可以查看某一天的网卡流量历史,使用-f选项,后面跟文件名,如果系统格式Redhat或者CentOS那么sar的库文件一定是在/var/log/sa/目录下的。

sar -n DEV -f /var/log/sa/sa24

2)查看历史负载 sar -q

sar -q

这个命令有助于我们查看服务器在过去的某个时间的负载状况。

nload命令

sar虽然可以查看网卡流量,但不够直视,还有一个更好用的工具就是nload,系统没有默认安装,安装方法:yum install -y epel-release;yum install -y nload

nload
第十三课时预习笔记_第6张图片

命令iostat

iostat命令被用于监视系统输入输出设备和CPU的使用情况。它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况。同vmstat一样,iostat也有一个弱点,就是它不能对某个进程进行深入分析,仅对系统的整体情况进行分析。


  • 查看系统输入输出设备和CPU的使用情况
[root@localhost ~]# iostat -x
Linux 3.10.0-514.el7.x86_64 (localhost.localdomain)     2017年11月28日     _x86_64_    (1 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.39    0.00    0.57    0.54    0.00   98.50

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sda               0.00     0.13    2.88    1.41   109.32    22.01    61.33     0.07   15.30    8.15   29.92   2.75   1.18
scd0              0.00     0.00    0.00    0.00     0.02     0.00     8.00     0.00    1.00    1.00    0.00   1.00   0.00
dm-0              0.00     0.00    1.87    0.63    98.28    21.09    95.43     0.08   31.78   11.79   90.70   4.45   1.11
dm-1              0.00     0.00    0.06    0.00     0.47     0.00    16.69     0.00    1.67    1.67    0.00   1.64   0.01
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

注意: util% 表示io等待占比,正常情况下该值和磁盘读写(r/w)成正比,如果该值很大,读写数值很小则说明磁盘存在问题,系统性能会受影响!


iotop命令

iotop命令是一个用来监视磁盘I/O使用状况的top类工具(动态)。iotop具有与top相似的UI,其中包括PID、用户、I/O、进程等相关信息。Linux下的IO统计工具如iostat,nmon等大多数是只能统计到per设备的读写情况,如果你想知道每个进程是如何使用IO的就比较麻烦,使用iotop命令可以很方便的查看。


  • 监视磁盘I/O的使用状况
[root@localhost ~]# iotop
Total DISK READ :   0.00 B/s | Total DISK WRITE :       0.00 B/s
Actual DISK READ:   0.00 B/s | Actual DISK WRITE:       0.00 B/s
  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND                    
 3694 be/4 root          0.00 B      0.00 B  0.00 %  0.02 % [kworker/0:0]
    1 be/4 root          0.00 B      0.00 B  0.00 %  0.00 % systemd --swit~-deserialize 21
    2 be/4 root          0.00 B      0.00 B  0.00 %  0.00 % [kthreadd]
    3 be/4 root          0.00 B      0.00 B  0.00 %  0.00 % [ksoftirqd/0]
  516 be/4 root          0.00 B      0.00 B  0.00 %  0.00 % crond -n
  517 be/4 root          0.00 B      0.00 B  0.00 %  0.00 % login -- root
……
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

说明: 
- 左右箭头:改变排序方式,默认是按IO排序; 
- r:改变排序顺序; 
- o:只显示有IO输出进程; 
- p:进程/线程的显示方式的切换; 
- a:显示累积使用量; 
- q:退出;

注意: 主要关注‘IO>’这一列!

 free命令

  下面是free的运行结果,一共有4行。为了方便说明,我加上了列号。这样可以把free的输出看成一个二维数组FO(Free Output)。例如:

  • FO[2][1] = 24677460
  • FO[3][2] = 10321516  

                   1          2          3          4          5          6
1              total       used       free     shared    buffers     cached
2 Mem:      24677460   23276064    1401396          0     870540   12084008
3 -/+ buffers/cache:   10321516   14355944
4 Swap:     25151484     224188   24927296

  free的输出一共有四行,第四行为交换区的信息,分别是交换的总量(total),使用量(used)和有多少空闲的交换区(free),这个比较清楚,不说太多。

  free输出地第二行和第三行是比较让人迷惑的。这两行都是说明内存使用情况的。第一列是总量(total),第二列是使用量(used),第三列是可用量(free)。

  第一行的输出时从操作系统(OS)来看的。也就是说,从OS的角度来看,计算机上一共有:

  • 24677460KB(缺省时free的单位为KB)物理内存,即FO[2][1];
  • 在这些物理内存中有23276064KB(即FO[2][2])被使用了;
  • 还用1401396KB(即FO[2][3])是可用的;

这里得到第一个等式:

  • FO[2][1] = FO[2][2] + FO[2][3]

FO[2][4]表示被几个进程共享的内存的,现在已经deprecated,其值总是0(当然在一些系统上也可能不是0,主要取决于free命令是怎么实现的)。

FO[2][5]表示被OS buffer住的内存。FO[2][6]表示被OS cache的内存。在有些时候buffer和cache这两个词经常混用。不过在一些比较低层的软件里是要区分这两个词的,看老外的洋文:

  • A buffer is something that has yet to be "written" to disk. 
  • A cache is something that has been "read" from the disk and stored for later use.

也就是说buffer是用于存放要输出到disk(块设备)的数据的,而cache是存放从disk上读出的数据。这二者是为了提高IO性能的,并由OS管理。

Linux和其他成熟的操作系统(例如windows),为了提高IO read的性能,总是要多cache一些数据,这也就是为什么FO[2][6](cached memory)比较大,而FO[2][3]比较小的原因。我们可以做一个简单的测试:

  1. 释放掉被系统cache占用的数据;

    echo 3>/proc/sys/vm/drop_caches

     

  2. 读一个大文件,并记录时间;
  3. 关闭该文件;
  4. 重读这个大文件,并记录时间;

第二次读应该比第一次快很多。原来我做过一个BerkeleyDB的读操作,大概要读5G的文件,几千万条记录。在我的环境上,第二次读比第一次大概可以快9倍左右。

  free输出的第二行是从一个应用程序的角度看系统内存的使用情况。

  • 对于FO[3][2],即-buffers/cache,表示一个应用程序认为系统被用掉多少内存;
  • 对于FO[3][3],即+buffers/cache,表示一个应用程序认为系统还有多少内存;

因为被系统cache和buffer占用的内存可以被快速回收,所以通常FO[3][3]比FO[2][3]会大很多。

这里还用两个等式:

  • FO[3][2] = FO[2][2] - FO[2][5] - FO[2][6]
  • FO[3][3] = FO[2][3] + FO[2][5] + FO[2][6]

这二者都不难理解。

  free命令由procps.*.rpm提供(在Redhat系列的OS上)。free命令的所有输出值都是从/proc/meminfo中读出的。

在系统上可能有meminfo(2)这个函数,它就是为了解析/proc/meminfo的。procps这个包自己实现了meminfo()这个函数。可以下载一个procps的tar包看看具体实现,现在最新版式3.2.8。

ps命令

Linux中的ps命令是Process Status的缩写。ps命令用来列出系统中当前运行的那些进程。ps命令列出的是当前那些进程的快照,就是执行ps命令的那个时刻的那些进程,如果想要动态的显示进程信息,就可以使用top命令。要对进程进行监测和控制,首先必须要了解当前进程的情况,也就是需要查看当前进程,而 ps 命令就是最基本同时也是非常强大的进程查看命令。使用该命令可以确定有哪些进程正在运行和运行的状态、进程是否结束、进程有没有僵死、哪些进程占用了过多的资源等等。总之大部分信息都是可以通过执行该命令得到的。
ps 为我们提供了进程的一次性的查看,它所提供的查看结果并不动态连续的;如果想对进程时间监控,应该用 top 或者 htop 。

ps工具标识进程的5种状态码: 

 
  1. D 不可中断 uninterruptible sleep (usually IO)

  2. R 运行 runnable (on run queue)

  3. S 中断 sleeping

  4. T 停止 traced or stopped

  5. Z 僵死 a defunct (”zombie”) process

 

ps命令支持三种使用的语法格式

 

三种语法格式

 
  1. 1.UNIX 风格,选项可以组合在一起,并且选项前必须有“-”连字符

  2. 2.BSD 风格,选项可以组合在一起,但是选项前不能有“-”连字符

  3. 3.GNU 风格的长选项,选项前有两个“-”连字符

能够混用这几种风格,但是可能会发生冲突。较多使用 UNIX 风格的ps命令。

日常生活中使用的ps命令的例子(UNIX 风格)。

 
  1. 1. 不加参数执行ps命令. 这是一个基本的 ps 使用

  2. 2. 显示所有当前进程. 使用 -a 参数。-a 代表 all。同时加上x参数会显示没有控制终端的进程。ps -ax | less

  3. 3. 根据用户过滤进程. 在需要查看特定用户进程的情况下,我们可以使用 -u 参数。

  4. 比如我们要查看用户'pungki'的进程,可以通过下面的命令: $ ps -u pungki

  5. 4. 通过cpu和内存使用来过滤进程. ps -aux | less 默认的结果集是未排序的。

  6. 可以通过 --sort命令来排序。. 根据 CPU 使用来升序排序. ps -aux --sort -pcpu | less

  7. 根据 内存使用 来升序排序 .ps -aux --sort -pmem | less

  8. ps -aux --sort -pcpu,+pmem | head -n 10

  9. 5. 通过进程名和PID过滤

  10. 使用 -C 参数,后面跟你要找的进程的名字。比如想显示一个名为getty的进程的信息,就可以使用下面的命令:

  11. $ ps -C getty

  12. 如果想要看到更多的细节,我们可以使用-f参数来查看格式化的信息列表:$ ps -f -C getty

  13. 6. 根据线程来过滤进程. 如果我们想知道特定进程的线程,可以使用-L 参数,后面加上特定的PID。$ ps -L 1213

  14. 7. 树形显示进程. 有时候我们希望以树形结构显示进程,可以使用 -axjf 参数。 $ps -axjf. 或者使用另一个命令:pstree

  15. 8. 显示安全信息. 如果想要查看现在有谁登入了你的服务器。可以使用ps命令加上相关参数:$ ps -eo pid,user,args

  16. 参数 -e 显示所有进程信息,-o 参数控制输出。Pid,User 和 Args参数显示PID,运行应用的用户和该应用。

  17. 9. 格式化输出root用户(真实的或有效的UID)创建的进程

  18. 系统管理员想要查看由root用户运行的进程和这个进程的其他相关信息时,可以通过下面的命令:

  19. $ ps -U root -u root u

  20. -U 参数按真实用户ID(RUID)筛选进程,它会从用户列表中选择真实用户名或 ID。真实用户即实际创建该进程的用户。

  21. -u 参数用来筛选有效用户ID(EUID)。

  22. 最后的u参数用来决定以针对用户的格式输出,由User, PID, %CPU, %MEM, VSZ, RSS, TTY, STAT, START, TIME 和 COMMAND这几 列组成。

  23. 10. 使用PS实时监控进程状态. ps 命令会显示你系统当前的进程状态,但是这个结果是静态的。

  24. 当有一种情况,我们需要像上面第四点中提到的通过CPU和内存的使用率来筛选进程,并且我们希望结果能够每秒刷新一次。

  25. 为此,我们可以将ps命令和watch命令结合起来。$ watch -n 1 ‘ps -aux --sort -pmem, -pcpu’

  26. 如果输出太长,我们也可以限制它,比如前20条,我们可以使用head命令来做到。

  27. $ watch -n 1 ‘ps -aux --sort -pmem, -pcpu | head 20’

  28. 这里的动态查看并不像top或者htop命令一样。但是使用ps的好处是你能够定义显示的字段,你能够选择你想查看的字段。

  29. 举个例子,如果你只需要看名为'pungki'用户的信息,你可以使用下面的命令:

  30. $ watch -n 1 ‘ps -aux -U pungki u --sort -pmem, -pcpu | head 20’

 

一些参数和使用实例

 

一些参数

 
  1. -A 列出所有的进程

  2. -w 显示加宽可以显示较多的资讯

  3. -au 显示较详细的资讯

  4. -aux 显示所有包含其他使用者的行程

  5. ############################################################

  6. 常用参数:

  7. -A 显示所有进程(等价于-e)(utility)

  8. -a 显示一个终端的所有进程,除了会话引线

  9. -N 忽略选择。

  10. -d 显示所有进程,但省略所有的会话引线(utility)

  11. -x 显示没有控制终端的进程,同时显示各个命令的具体路径。dx不可合用。(utility)

  12. -p pid 进程使用cpu的时间

  13. -u uid or username 选择有效的用户id或者是用户名

  14. -g gid or groupname 显示组的所有进程。

  15. U username 显示该用户下的所有进程,且显示各个命令的详细路径。如:ps U zhang;(utility)

  16. -f 全部列出,通常和其他选项联用。如:ps -fa or ps -fx and so on.

  17. -l 长格式(有F,wchan,C 等字段)

  18. -j 作业格式

  19. -o 用户自定义格式。

  20. v 以虚拟存储器格式显示

  21. s 以信号格式显示

  22. -m 显示所有的线程

  23. -H 显示进程的层次(和其它的命令合用,如:ps -Ha)(utility)

  24. e 命令之后显示环境(如:ps -d e; ps -a e)(utility)

  25. h 不显示第一行

使用实例

 
  1. ############################################################

  2. ps命令常用用法(方便查看系统进程)

  3. 1)ps a 显示现行终端机下的所有程序,包括其他用户的程序。

  4. 2)ps -A 显示所有进程。

  5. 3)ps c 列出程序时,显示每个程序真正的指令名称,而不包含路径,参数或常驻服务的标示。

  6. 4)ps -e 此参数的效果和指定"A"参数相同。

  7. 5)ps e 列出程序时,显示每个程序所使用的环境变量。

  8. 6)ps f 用ASCII字符显示树状结构,表达程序间的相互关系。

  9. 7)ps -H 显示树状结构,表示程序间的相互关系。

  10. 8)ps -N 显示所有的程序,除了执行ps指令终端机下的程序之外。

  11. 9)ps s 采用程序信号的格式显示程序状况。

  12. 10)ps S 列出程序时,包括已中断的子程序资料。

  13. 11)ps -t<终端机编号>  指定终端机编号,并列出属于该终端机的程序的状况。

  14. 12)ps -u root  显示root用户信息

  15. 13)ps x  显示所有程序,不以终端机来区分。

  16. 最常用的方法是ps -aux,然后再利用一个管道符号导向到grep去查找特定的进程,然后再对特定的进程进行操作。

  17. ############################################################

  18. 实例3:显示所有进程信息,连同命令行

  19. 命令:ps -ef

  20. 实例4:ps 与grep 常用组合用法,查找特定进程

  21. 命令:ps -ef|grep ssh

  22. 实例5:将目前属于您自己这次登入的 PID 与相关信息列示出来

  23. 命令:ps -l

  24. 说明:

  25. 各相关信息的意义:

  26. F 代表这个程序的旗标 (flag), 4 代表使用者为 super user

  27. S 代表这个程序的状态 (STAT),关于各 STAT 的意义将在内文介绍

  28. UID 程序被该 UID 所拥有

  29. PID 就是这个程序的 ID !

  30. PPID 则是其上级父程序的ID

  31. C CPU 使用的资源百分比

  32. PRI 这个是 Priority (优先执行序) 的缩写,详细后面介绍

  33. NI 这个是 Nice 值,在下一小节我们会持续介绍

  34. ADDR 这个是 kernel function,指出该程序在内存的那个部分。如果是个 running的程序,一般就是 "-"

  35. SZ 使用掉的内存大小

  36. WCHAN 目前这个程序是否正在运作当中,若为 - 表示正在运作

  37. TTY 登入者的终端机位置

  38. TIME 使用掉的 CPU 时间。

  39. CMD 所下达的指令为何

  40. 在预设的情况下, ps 仅会列出与目前所在的 bash shell 有关的 PID 而已,所以, 当我使用 ps -l 的时候,只有三个 PID。

  41. 实例6:列出目前所有的正在内存当中的程序

  42. 命令:ps aux

  43. 说明:

  44. USER:该 process 属于那个使用者账号的

  45. PID :该 process 的号码

  46. %CPU:该 process 使用掉的 CPU 资源百分比

  47. %MEM:该 process 所占用的物理内存百分比

  48. VSZ :该 process 使用掉的虚拟内存量 (Kbytes)

  49. RSS :该 process 占用的固定的内存量 (Kbytes)

  50. TTY :该 process 是在那个终端机上面运作,若与终端机无关,则显示 ?,另外, tty1-tty6 是本机上面的登入者程序,若为 pts/0 等等的,则表示为由网络连接进主机的程序。

  51. STAT:该程序目前的状态,主要的状态有

  52. R :该程序目前正在运作,或者是可被运作

  53. S :该程序目前正在睡眠当中 (可说是 idle 状态),但可被某些讯号 (signal) 唤醒。

  54. T :该程序目前正在侦测或者是停止了

  55. Z :该程序应该已经终止,但是其父程序却无法正常的终止他,造成 zombie (疆尸) 程序的状态

  56. START:该 process 被触发启动的时间

  57. TIME :该 process 实际使用 CPU 运作的时间

  58. COMMAND:该程序的实际指令

  59. 实例7:列出类似程序树的程序显示

  60. 命令:ps -axjf

  61. 实例8:找出与 cron 与 syslog 这两个服务有关的 PID 号码

  62. 命令:ps aux | egrep '(cron|syslog)'

  63.  
  64. 3. 输出指定的字段

  65. 命令:ps -o pid,ppid,pgrp,session,tpgid,comm

  66.  
  67. 注意:"ps aux"和"ps -aux"不相同。例如"-u"用来显示该用户的进程。但是"u"则是显示详细的信息。

  68. BSD风格:在BSD风格的语法选项前不带连字符。例如: ps aux

  69. UNIX/LINUX的风格:在linux风格的语法选项前面有一个破折号.例如: ps -ef

  70. 混合使用两种Linux系统上的语法风格是好事儿。例如“ps ax -f”。

  71. 1、显示所有进程:

  72. $ ps ax

  73. $ ps -ef

  74. "u"或者"-f"参数来显示所有进程的详细信息

  75. $ ps aux

  76. $ ps -ef -f

  77. 注意:为什么用户列不显示我的用户名,但显示其他用户,如root、www等,对于所有的用户名(包括你)如果长度大于8个字符,然后ps将只显示UID,而不是用户名。

  78. 2、根据用户显示进程:

  79. 由进程的所属用户使用“-u”选项后跟用户名来显示。多个用户名可以提供以逗号分隔。

  80. $ ps -f -u www-data

  81. 3、通过名字和进程ID显示进程:

  82. 通过名字或命令搜索进程,使用“-C”选项后面加搜索词。

  83. $ ps -C apache2

  84. 4、根据CPU或者内存进行排序:

  85. “–sort”选项由逗号分隔的多个字段可以用指定。此外,该字段可以带有前缀“-”或“”符号,表示降序或升序分别排序。通过进程列表进行排序有很多参数,你可以检查手册页的完整列表。

  86. $ ps aux --sort=-pcpu,+pmem

  87. $ ps aux --sort=-pcpu | head -5

  88. 5、用树的风格显示进程的层次关系:

  89. 许多进程实际上是一些父进程分的分支,知道这父子进程关系往往是有用的。在'–forest'选项将建立ASCII艺术风格层次的树视图。

  90. 下面的命令将搜索进程名字为Apache2,形成一个树结构来显示详细的信息。

  91. $ ps -f --forest -C apache2

  92. 6、显示一个父进程的子进程:

  93. 这里有一个例子显示所有apache进程的分支

  94. $ ps -o pid,uname,comm -C apache2

  95. 7、显示一个进程的线程:

  96. “-L”选项将显示进程的线程。它可以用来显示特定进程的所有线程或者所有进程。

  97. 下面的命令将显示所有id为3150的进程所拥有的线程。

  98. $ ps -p 3150 -L

  99. 8、改变要显示的列:

  100. ps命令可以配置为只显示选中的列表。为了显示完整列表可以查看手册。

  101. 下面的命令只显示PID,用户名,CPU,内存和命令的列。

  102. $ ps -e -o pid,uname,pcpu,pmem,comm

  103. 可以重命名列标签,相当的灵活。

  104. $ ps -e -o pid,uname=USERNAME,pcpu=CPU_USAGE,pmem,comm

  105. 9、显示进程运行的时间:

  106. 表示进程的运行时间。对于运行的时间,列默认情况下是不显示的,可以使用“-O”选项查看。

  107. $ ps -e -o pid,comm,etime

  108. 10、把ps命令变成一个实时查看器:

  109. 像往常一样,watch命令可以用来实时捕捉ps显示进程。简单的例子如下:

  110. $ watch -n 1 'ps -e -o pid,uname,cmd,pmem,pcpu --sort=-pmem,-pcpu | head -15'

要对系统中进程进行监测控制,查看状态,内存,CPU的使用情况,使用命令:/bin/ps
(1) ps :是显示瞬间进程的状态,并不动态连续;
(2) top:如果想对进程运行时间监控,应该用 top 命令;
(3) kill 用于杀死进程或者给进程发送信号;
(4) 查看文章最后的man手册,可以查看ps的每项输出的含义,to find: STANDARD FORMAT SPECIFIERS

检查网络状态

在我系统中网卡eth0 目录如下:

检测网络状态是可以根据里面的配置值:up 或down 判断网卡是否启用。

源码贴出如下:

 
  1. #include

  2. #include

  3. #include

  4. #include

  5. #include

  6. #include

  7. #include

  8. #include

  9. #include

  10. #include

  11. #include

  12. #include

  13. #include

  14.  
  15. int connect_check()

  16. {

  17.  
  18. int net_fd;

  19. char statue[20];

  20.  
  21. net_fd=open("/sys/class/net/eth0/operstate",O_RDONLY);//以只读的方式打开/sys/class/net/eth0/operstate

  22. if(net_fd<0)

  23. {

  24.  
  25. printf("open err\n");

  26. return 0;

  27. }

  28.  
  29. printf("open success\n");

  30. memset(statue,0,sizeof(statue));

  31. int ret=read(net_fd,statue,10);

  32. printf("statue is %s",statue);

  33. if(NULL!=strstr(statue,"up"))

  34. {

  35. printf("on line\n");

  36. return 0;

  37. }

  38. else if(NULL!=strstr(statue,"down"))

  39. {

  40. printf("off line\n");

  41. return 0;

  42. }

  43. else

  44. {

  45. printf("unknown err\n");

  46. return 0;

  47. }

  48.  
  49.  
  50.  
  51.  
  52.  
  53.  
  54. }

  55. int main(int argc,char*argv[])

  56. {

  57. connect_check();

  58. return 0;

  59.    

linux下抓包

主要语法

  • 过滤主机/IP: 
    • tcpdump -i eth1 host 172.16.7.206
    • 抓取所有经过网卡1,目的IP为172.16.7.206的网络数据 

       

  • 过滤端口: 
    • tcpdump -i eth1 dst port 1234
    • 抓取所有经过网卡1,目的端口为1234的网络数据 

       

  • 过滤特定协议: 
    • tcpdump -i eth1 udp
    • 抓取所有经过网卡1,协议类型为UDP的网络数据 

       

  • 抓取本地环路数据包 
    • tcpdump -i lo udp 抓取UDP数据
    • tcpdump -i lo udp port 1234 抓取端口1234的UDP数据
    • tcpdump -i lo port 1234 抓取端口1234的数据 

       

  • 特定协议特定端口: 
    • tcpdump udp port 1234
    • 抓取所有经过1234端口的UDP网络数据 

       

  • 抓取特定类型的数据包: 
    • tcpdump -i eth1 ‘tcp[tcpflags] = tcp-syn’
    • 抓取所有经过网卡1的SYN类型数据包
    • tcpdump -i eth1 udp dst port 53
    • 抓取经过网卡1的所有DNS数据包(默认端口) 

       

  • 逻辑语句过滤: 
    • tcpdump -i eth1 ‘((tcp) and ((dst net 172.16) and (not dst host 192.168.1.200)))’
    • 抓取所有经过网卡1,目的网络是172.16,但目的主机不是192.168.1.200的TCP数据 

       

  • 抓包存取: 
    • tcpdump -i eth1 host 172.16.7.206 and port 80 -w /tmp/xxx.cap
    • 抓取所有经过网卡1,目的主机为172.16.7.206的端口80的网络数据并存储

linux网络相关

ifconfig命令

  • 查看网卡IP

如果系统没有该命令可以使用yum安装:

[root@adai003 ~]# yum install -y net-tools

查看网卡IP还可以使用命令:ip add,这个显示有点乱!

  • ifconfig -a

显示所有网卡信息(包括down掉的或者没有IP地址的网卡)

启动/关闭网卡

  • ifup/ifdown [网卡名]

应用环境:更改单个指定网卡配置后需要重启才能生效,为了避免关闭或重启所有网卡可以对单个网卡执行该命令。
注: 如果网卡正在使用中,不要单独使用ifdown命令!!!解决办法: “# ifdown ens33 && ifup ens33”,使两个命令一起执行!

为虚拟机添加网卡

关闭虚拟机,按如下顺序操作:

点击下一步:


在此可以指定网络适配器(网卡)类型,也可以在添加完成后进行选择:

点击“确定”即添加完成!

注: 如果以上操作是在开机状态下执行,添加完成后需要重启网络服务!!!

为新增网卡添加配置文件

查看新增网卡的配置信息:


在此可以查看其所在网段。

配置新增网卡信息:
开启虚拟机后进行如下操作:

查看网络信息: 

网卡配置文件位置(复制原有网卡,进行重命名):
/etc/sysconfig/network-scripts/  
[root@localhost ~]# cd /etc/sysconfig/network-scripts/创建新增网卡配置文件:
[root@localhost network-scripts]# cp ifcfg-ens33 ifcfg-ens37[root@localhost network-scripts]# vim ifcfg-ens37#更改该配置文件下的网卡名为ens37#删除UUID配置完成后重启网络服务:
[root@localhost network-scripts]# systemctl restart network至此,添加完成,之后变可以通过编辑该文件来配置该网卡!!!

注: 因本次添加的网卡的网络连接类型是host-only模式,所以其IP和ens33不在同一网段。

增加虚拟网卡

  • 步骤:

1、切换至网卡配置文件
[root@adai003 ~]# cd /etc/sysconfig/network-scripts/2、复制系统网卡
[root@adai003 network-scripts]# cp ifcfg-ens33 ifcfg-ens33\:0 3、编辑复制的配置文件
[root@adai003 network-scripts]# vi ifcfg-ens33\:0TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33:0
DEVICE=ens33:0
ONBOOT=yes
IPADDR=192.168.8.138
NETMASK=255.255.255.0
GATEWAY=192.168.8.2
DNS1=119.29.29.29
说明:更改NAME、DEVICE、IPADDR,系统已经设定网关可DNS,所以在此可以删除GATEWAY和DNS,也可以保留,但是,如果要保留该选项则必须保持其与系统网卡配置一致!

4、重启系统网卡
[root@adai003 network-scripts]# ifdown ens33 && ifup ens33成功断开设备 'ens33'。
成功激活的连接(D-Bus 激活路径:/org/freedesktop/NetworkManager/ActiveConnection/3)

5、查看网卡信息
[root@adai003 network-scripts]# ifconfigens33: flags=4163  mtu 1500
        inet 192.168.8.125  netmask 255.255.255.0  broadcast 192.168.8.255
        ……

ens33:0: flags=4163  mtu 1500
        inet 192.168.8.158  netmask 255.255.255.0  broadcast 192.168.8.255
        ether 00:0c:29:61:7d:7a  txqueuelen 1000  (Ethernet)

lo: flags=73  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10
        loop  txqueuelen 1  (Local Loopback)
        ……
6、检测虚拟网啊IP是否通畅

在Windows系统cmd下ping该IP即可!

查看网卡是否连接

  • 方法1:mii-tool [网卡名]

[root@adai003 ~]# mii-tool ens33ens33: negotiated 1000baseT-FD flow-control, link ok

查看:link ok说明网卡连接OK!

  • 方法2:ethtool [网卡名]

[root@adai003 ~]# ethtool ens33Settings for ens33:
	Supported ports: [ TP ]
	Supported link modes:   10baseT/Half 10baseT/Full 
……
	Current message level: 0x00000007 (7)
			       drv probe link
	Link detected: yes

查看:Link detected: yes说明网卡连接OK!

主机名

  • 更改主机名&主机名配置文件

更改:
[root@adai003 ~]# hostnamectl set-hostname adai0003查看主机名:
[root@adai003 ~]# hostnameadai0003
注:更改后的主机名要在系统重启之后才会显示!  

主机名的配置文件:
[root@adai003 ~]# cat /etc/hostname adai003

DNS配置

  • DNS配置文件:/etc/resolv.conf

[root@adai003 ~]# cat /etc/resolv.conf # Generated by NetworkManagernameserver 119.29.29.29

注: 更改网卡配置即可更改DNS配置文件,更改后需要重启网卡(ifdown/ifup)后生效,也可编辑‘/etc/resolv.conf’临时更改DNS配置,该办法在重启网卡后会被网卡配置文件中的DNS覆盖!

  • 本地域名配置文件文件:/etc/hosts

[root@adai003 ~]#  cat /etc/hosts127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

说明: 使用vi命令可在该配置文件下可以自定义IP所对应的域名(一个IP对应多个域名或一个域名对应多个IP,用空格隔开,当一个域名对应多个IP时,以配置文件中靠后面的配置为准),但是该域名配置只在本机生效!

10.12 firewalld和netfilter

SELinux防火墙

  • 临时关闭SELinux防火墙:

[root@adai003 ~]# setenforce 0
  • 永久关闭SELinux防火墙:

编辑配置文件‘/etc/selinux/config’

[root@adai003 ~]# vim /etc/selinux/config……#     disabled - No SELinux policy is loaded.SELINUX=disabled# SELINUXTYPE= can take one of three two values:……#     mls - Multi Level Security protection.SELINUXTYPE=targeted

将SELINUX=enforcing改为disabled保存,重启系统即可!

  • 查看SELinux防火墙状态

[root@adai003 ~]# getenforceDisabled

netfilter(Firewalld)

Centos7中默认将原来(centos5/6)的防火墙netfileter升级为了firewalld。iptables是它们实现防火墙功能的工具。

为了方便学习,暂时停用firewalld,开启centos6/5的防火墙机制netfilter。

  • 停用firewalld

1、关闭firewalld(禁止开机启动)
[root@adai003 ~]# systemctl disable firewalldRemoved symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
Removed symlink /etc/systemd/system/basic.target.wants/firewalld.service.2、停止firewalld服务
[root@adai003 ~]# systemctl stop firewalld
  • 开启netfilter

开启前先安装iptables工具包:
[root@adai003 ~]# yum install -y iptables-services  开启iptables服务:
[root@adai003 ~]# systemctl enable iptablesCreated symlink from /etc/systemd/system/basic.target.wants/iptables.service to /usr/lib/systemd/system/iptables.service.
[root@adai003 ~]# systemctl start iptables

说明: 安装完成后默认开启iptables服务。

  • 查看iptables规则:iptables -nvL

[root@adai003 ~]# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    7   536 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           
    0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:22
    0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT 5 packets, 684 bytes)
 pkts bytes target     prot opt in     out     source               destination

你可能感兴趣的:(第十三课时预习笔记)