CnSwift - 雨燕

agile development - 敏捷开发

Linux使用者管理

Linux使用者管理

系统的资源查看

free:查看内存的使用情况

格式:

free [-b|-k|-m|-g|] [-t]

参数:

-b:直接输入free时,显示的单位是KB我们可以使用b(bytes),m(MB),k(KB),g(GB)来显示单位

-t:在输出的最终结果中显示物理内存与swap的总量

1
2
3
4
[root@localhost test6]# free -m
total used free shared buff/cache available
Mem: 1839 1015 78 19 745 572
Swap: 2047 179 1868

Mem那一行显示的是物理内存的量,Swap是虚拟内存的量,total是总量,used是已被使用的量,free是剩余可用的量,后面的shared、buff/cache则是在已被使用的量当中用来作为缓冲及快取的量。

注意:物理内存被用光是正常的,Swap内存如果被使用超过20%,那就需要增加物理内存了,因为Swap的性能跟物理内存是在差太多,而系统会使用到Swap内存,绝对是因为物理内存不足导致的。

uname:查看系统与内核的相关信息

格式:

uname [-asrmpi]

参数:

-a:所有系统相关的信息,包括下面的数据都会列出来

-s:系统内核名称

-r:内核的版本

-m:本系统的硬件名称,例如:i686或x86_64等

-p:CPU的类型,与-m类似,只是显示的是CPU的类型

-i:硬件的平台(ix86)

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@localhost test6]# uname
Linux
[root@localhost test6]# uname -a
Linux localhost.localdomain 3.10.0-693.17.1.el7.x86_64 #1 SMP Thu Jan 25 20:13:58 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
[root@localhost test6]# uname -s
Linux
[root@localhost test6]# uname -r
3.10.0-693.17.1.el7.x86_64
[root@localhost test6]# uname -m
x86_64
[root@localhost test6]# uname -p
x86_64
[root@localhost test6]# uname -i
x86_64

uptime:查看系统启动时间与工作负载

这个命令显示出目前系统已经开机多长时间,以及1,5,15分钟的平均负载。也就是top命令显示出来的第一行内容。

netstat:跟踪网络

netstat的输出分为两大部分,分别是网络与系统自己的进程相关性部分。

这个命令比较常被用在网络监控方面,这个命令的执行结果如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@localhost test6]# netstat
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 localhost.localdoma:ssh 10.58.95.76:50001 ESTABLISHED
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ] DGRAM 12214 /run/systemd/shutdownd
unix 2 [ ] DGRAM 7386 /run/systemd/notify
unix 2 [ ] DGRAM 7388 /run/systemd/cgroups-agent
unix 2 [ ] DGRAM 16609 /var/run/chrony/chronyd.sock
unix 5 [ ] DGRAM 7403 /run/systemd/journal/socket
unix 24 [ ] DGRAM 7405 /dev/log
unix 3 [ ] STREAM CONNECTED 21129
unix 3 [ ] STREAM CONNECTED 29125
中间部分省略...
unix 3 [ ] STREAM CONNECTED 28788 @/tmp/.X11-unix/X0
unix 3 [ ] STREAM CONNECTED 27158
unix 3 [ ] STREAM CONNECTED 16852 /var/run/dbus/system_bus_socket

在上面的结果当中,显示了两部分,分别是网络的连接以及Linux上面的socket程序相关性的部分。

我们先来看看因特网连接情况的部分:

Proto:网络的数据包协议,主要分为TCP与UDP数据包

Recv-Q:非由用户进程连接到此socket的复制的总字节数

Send-Q:非由远程主机传送过来的acknowledged总字节数

Local Address:本地的IP端口情况

Foreign Address:远程主机的IP端口情况

State:连接状态,主要有建立(ESTABLISED)及监听(LISTEN)

Socket程序相关性的部分:

除了网络上的连接之外,其实Linux系统上面的进程是可以接收不同进程所发送来的信息,就是Linux上面的Socket file。socket file可以沟通两个进程之间的信息,因此进程可以取得对方传送过来的数据。

socket file的输出字段:

Proto:一般就是unix

RefCnt:连接到此socket的进程数量

Flags:连接的标识

Type:socket访问的类型。主要有确认连接的STREAM与不需确认的DGRAM

State:若为CONNECTED表示多个进程之间已经连接建立

I-Node:连接到此socket的相关程序的路径,或者是相关数据输出的路径

Path:连接到此socket的相关程序的路径,或者是相关数据输出的路径

格式:

netstat -[atunlp]

参数:

-a:将目前系统上的所有连接、监听、Socket数据都列出来

-t:列出tcp网路数据包的数据

-u:列出udp网路数据包的数据

-n:不列出进程服务名称、以端口号(port number)来显示

-l:列出目前正在网路监听(listen)的服务

-p:列出该网络服务的进程PID

netstat可以帮我们进行什么任务呢?

示例1:

找出目前系统上已在监听的网络连接及其PID

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@localhost test6]# netstat -tnlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:11211 0.0.0.0:* LISTEN 1024/memcached
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 1034/redis-server 1
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 1/systemd
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1106/nginx: master
tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 1652/dnsmasq
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1001/sshd
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 1002/cupsd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 4132/sendmail: acce
tcp6 0 0 :::3306 :::* LISTEN 2103/mysqld
tcp6 0 0 :::111 :::* LISTEN 1/systemd
tcp6 0 0 :::22 :::* LISTEN 1001/sshd
tcp6 0 0 ::1:631 :::* LISTEN 1002/cupsd

除了可以列出监听网络的端口与状态之外,最后一个字段还能够显示此服务的PID号码以及进程的命令名称。

dmesg:分析内核产生的信息

系统在开机的时候,内核会去检测系统的硬件,就是使用的dmesg,所有内核检测的信息,都会被记录在内存中的某个保护区段。dmesg这个命令就能够将该区段的信息读出来。因为信息实在太多,所以我们可以加入管道命令more来查看。

示例1:

查找开机的时候硬盘的相关信息

dmesg | grep -i hd

示例2:

查看网卡的信息

dmesg | grep -i eth

vmstat:检测系统资源变化

格式:

vmstat [-a] [延迟[总计检测次数]]

vmstat [-fs]

vmstat [-S单位]

vmstat [-d]

vmstat [-p分区]

参数:

-a:使用inactive/active(活跃与否)替代buffer/cache的内存输出信息

-f:开机到目前为止系统复制(fork)的进程数

-s:将一些事件(开机至目前为止)导致的内存变化情况列表说明

-S:后面可以接单位,让显示的数据有单位。例如K/M取代bytes的容量

-d:列出磁盘的读写总量统计表

-p:后面列出分区,可显示该分区的读写总量统计表

示例1:

统计目前主机CPU状态,每秒一次,共计三次

1
2
3
4
5
6
[root@localhost test6]# vmstat 1 3
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
2 0 183684 78536 24 765304 0 1 48 21 255 72 0 0 99 0 0
0 0 183684 78536 24 765304 0 0 0 0 182 243 0 0 100 0 0
0 0 183684 78536 24 765304 0 0 0 0 197 272 0 0 100 0 0

利用vmstat甚至可以进行跟踪。你可以使用类似vmstat 5代表每5秒钟更新一次,且一直更新,直到你按下[ctrl] + c为止。如果你想要实时知道系统资源的运行状态,这个命令就不能不知道。

上面各字段的意义是:

内存字段(procs)的选项分别为:

r:等待运行中的进程数

b:不可被唤醒的进程数量

这两个选项越多,代表系统越来越忙碌(因为系统太忙,所以很多进程就无法被执行或一直在等待而无法被唤醒)。

内存字段(memory)选项分别为:

swpd:虚拟内存被使用的总量

free:未被使用的内存容量

buff:用于缓冲存储器

cache:用于高速缓存,这部分与free是相同的

内存交换空间(swap)的选项分别为:

si:由磁盘中将程序取出的量

so:由于内存不足而将没用到的程序写入到磁盘的swap的容量

如果si/so的数值太大,表示内存内的数据经常得在磁盘与内存之间传来传去,系统的性能会很差

磁盘读写(io)的选项分别为:

bi:由磁盘写入的块数量

bo:写入到磁盘去的块数量

如果这部分的值越高,代表系统的I/O越忙碌

系统(system)的项目分别为:

in:每秒被中断的进程次数

cs:每秒中进行的事件切换次数

这两个数值越大,代表系统与接口设备的通信非常频繁。这些接口设备当然包括磁盘、网卡、时钟等

CPU的选项分别为:

us:非内核层的CPU使用状态

sy:内核层所使用的CPU状态

id:闲置的状态

wa:等待I/O所耗费的CPU状态

st:被虚拟机(virtual machine)所盗用的CPU使用状态(2.6.11内核以后支持)

示例2:

系统上面所有的磁盘的读写状态

1
2
3
4
5
6
7
 [root@localhost test6]# vmstat -d
disk- ------------reads------------ ------------writes----------- -----IO------
total merged sectors ms total merged sectors ms cur sec
sr0 21 0 128 35 0 0 0 0 0 0
sda 247718 2143 15894556 562599 193309 65366 7038494 598914 0 189
dm-0 247053 0 15808361 562125 196088 0 6654301 781463 0 188
dm-1 2212 0 21400 3339 47492 0 379936 459849 0 1

fuser 通过文件(或文件系统)找出正在使用该文件的程序

如果我想知道我的进程到底在这次启动中打开了多少文件,可以利用fuser来查看。比如说我们在卸载某个软件的时候,如果提示“device is busy”,代表这个软件在工作中,表示有某个进程在使用这个软件。那么我们就可以用fuser追踪一下。

格式:

fuser [-umv] [-k[i][-signal]] file/dir

参数:

-u:除了进程的PID之外,同时列出该进程的所有者

-m:后面接的那个文件名会主动上提到该文件系统的所顶层,对umount不成功很有效

-v:可以列出每个文件与程序还有命令的完整相关性

-k:找出使用该文件/目录的PID,并试图以SIGKILL这个信号给予该PID

-i:必须与-k配合,在删除PID之前会先询问用户意愿

-signal:例如1-15等,若不加的话,默认是SIGKILL(-9)

示例1:找出目前所在目录的使用PID/所属帐号/权限

1
2
3
4
[root@localhost swoole]# fuser -uv .
用户 进程号 权限 命令
/mnt/share/PHP/test.com/swoole:
root 13569 ..c.. (root)bash

输出结果显示,“.”下面有个PID为13569的程序,该程序属于root且命令为bash。权限(ACCESS)选项的值代表的意思是:

c:此进程在当前的目录下(非子目录)

e:可被触发为执行状态

f:是一个被打开的文件

r:代表顶层目录(root directory)

F:该文件被打开了,不过在等待回应中

m:可能为分享的动态函数库

示例2:找到所有使用到/proc这个文件系统的进程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@localhost swoole]# fuser -mvu /proc
用户 进程号 权限 命令
/proc: root kernel mount (root)/proc
root 1 f.... (root)systemd
root 466 f.... (root)systemd-journal
rtkit 641 .rc.. (rtkit)rtkit-daemon
root 1032 F.... (root)libvirtd
root 1522 F.... (root)X
root 2178 f.... (root)packagekitd
root 2575 f.... (root)gvfs-udisks2-vo
root 2591 f.... (root)udisksd
root 2645 f.... (root)gnome-settings-
root 2680 f.... (root)gvfsd-trash
root 2715 f.... (root)tracker-extract

lsof 列出被进程所打开的文件名

如何查出某个进程打开或者使用的文件与设备呢?那就是使用lsof

格式:

lsof [-aUu] [+d]

参数:

-a:多项数据需要“同时成立”才显示出结果时

-U:仅列出Unix like系统的socket文件类型

-u:后面接username,列出该用户相关进程所打开的文件

+d:后面接目录,即找出某个目录下面已经被打开的文件

示例1:仅列出关于root的所有进程打开的socket文件

1
2
3
4
5
6
7
8
9
10
11
[root@localhost swoole]# lsof -u root -a -U
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root 12u unix 0xffff880077b7bc00 0t0 11854 /run/systemd/private
systemd 1 root 20u unix 0xffff880077b7b400 0t0 11876 /run/lvm/lvmetad.socket
systemd 1 root 21u unix 0xffff880077b7a000 0t0 11879 /run/udev/control
systemd 1 root 22u unix 0xffff880077a7a400 0t0 7386 /run/systemd/notify
systemd 1 root 23u unix 0xffff880077a7ac00 0t0 7388 /run/systemd/cgroups-agent
systemd 1 root 24u unix 0xffff88007c214800 0t0 7400 /run/systemd/journal/stdout
systemd 1 root 27u unix 0xffff880077aee000 0t0 7403 /run/systemd/journal/socket
systemd 1 root 28u unix 0xffff880077aee400 0t0 7405 /dev/log
省略...

注意:参数-a就是解决同时-u和-U两个参数都成立

示例2:请列出目前系统上面所有的被启动的周边设备

1
2
3
4
5
6
7
8
9
10
11
[root@localhost swoole]# lsof +d /dev
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root 0u CHR 1,3 0t0 4856 /dev/null
systemd 1 root 1u CHR 1,3 0t0 4856 /dev/null
systemd 1 root 2u CHR 1,3 0t0 4856 /dev/null
systemd 1 root 28u unix 0xffff880077aee400 0t0 7405 /dev/log
systemd 1 root 31r CHR 10,235 0t0 7039 /dev/autofs
kdevtmpfs 12 root cwd DIR 0,5 3160 3 /dev
kdevtmpfs 12 root rtd DIR 0,5 3160 3 /dev
systemd-j 466 root 0r CHR 1,3 0t0 4856 /dev/null
省略...

注意:因为设备都在/dev里面,所以查找目录即可。

示例3:显示出属于root的bash这个进程所打开的文件

1
2
3
4
5
6
7
8
9
10
11
[root@localhost swoole]# lsof -u root | grep bash
ksmtuned 687 root txt REG 253,0 960608 50334153 /usr/bin/bash
mysqld_sa 1077 root txt REG 253,0 960608 50334153 /usr/bin/bash
mysqld_sa 1077 root mem REG 253,0 123267 50362713 /usr/share/locale/zh_CN/LC_MESSAGES/bash.mo
bash 13569 root cwd DIR 0,38 192 218625 /mnt/share/PHP/test.com/swoole
bash 13569 root rtd DIR 253,0 269 64 /
bash 13569 root txt REG 253,0 960608 50334153 /usr/bin/bash
bash 13569 root mem REG 253,0 62184 3311702 /usr/lib64/libnss_files-2.17.so
bash 13569 root mem REG 253,0 106070960 50365106 /usr/lib/locale/locale-archive
bash 13569 root mem REG 253,0 2127336 53679 /usr/lib64/libc-2.17.so
省略...

注意:这个命令可以找出你想要知道的某个进程是否打开哪些信息

pidof 找出某个正在执行的进程的PID

格式:

pidof [-sx] program_name

参数:

-s:仅列出一个PID而不列出所有的PID

-x:同时列出该program name可能的PPID那个进程的PID

更多精彩内容,请关注公众号 Golang语言开发栈公众号二维码
感谢赞赏.

Welcome to my other publishing channels