Linux简介
Linux 就是一组软件,而软件分为操作系统软件和应用软件,当然 Linux 属于操作系统软件。
计算机是由一堆硬件组成的,为了有效的控制这些硬件资源,于是乎就有了操作系统的 产生,操作系统除了有效的控制这些硬件资源的分配,并提供计算机运作所需要的功能(如网络功能)之外,为了要提供程序设计师更容易开发软件的环境,所以操作系统也会提供一 组系统调用的接口。而 Linux就是一款十分成熟的操作系统软件。
操作系统软件就是具有以下功能的软件:windows mac Linux
(1)控制硬件资源
(2)提供计算机运作所需要的功能
(3)提供给程序员系统调用的接口,提供了更容易的开发环境。
Linux和Windows的区别
1、Linux主要使用命令行操作系统,Windows是图形化界面
2、Linux主要应用于服务器,Windows是个人操作系统
3、Linux属于开源项目,Windows不开源
4、Linux是多用户系统,Windows是单用户系统
多用户系统:多个人可以同时操作计算机
单用户系统:只能由一个用户进行操作
Linux内核版本和发行版本
Linux内核版本
内核是系统的心脏,是运行程序和管理像磁盘和打印机等硬件设备的核心程序,它提供了一个在裸设备与应用程序间的抽象层。例如,程序本身不需要了解用户的主板芯片集或磁盘控制器的细节就能在高层次上读写磁盘。
Linux 最早是由芬兰人 Linus Torvalds 设计的。当时由于 UNⅨ的商业化,Andrew Tannebaum 教授开发了 Minix 操作系统以便于不受 AT&T 许可协议的约束,为教学科研提 供一个操作系统。Linus Torvalds 借鉴了 Minix 操作系统,自己动手写了一个“类 Minix”的 操作系统,即就是 Linux 系统的雏形。1991 年 11 月,Linux0.10 版本推出,0.11 版本随后在 1991 年 12 月推出,当时将它发布在 Internet 上,免费供人们使用。当 Linux 非常接近于一 种可靠的/稳定的系统时,Linus 决定将 0.13 版本称为 0.95 版本。1994 年 3 月,正式的Linux 1.0 出现了,这差不多是一种正式的独立宣言。截至那时为止,它的用户基数已经发 展得很大,而且 Linux 的核心开发队伍也建立起来了。
内核官网:https://www.kernel.org
Linux发行版本
仅有内核而没有应用软件的操作系统是无法使用的,所以许多公司或社团将内核、源代码及相关的应用程序组织构成一个完整的操作系统,让一般的用户可以简便地安装和使用Linux,这就是所谓的发行版本(distribution),一般谈论的Linux系统便是针对这些发行版本的。目前估计各种发行版本有数十种,它们的发行版本号各不相同,使用的内核版本号也可能不一样,下面就为读者介绍目前比较著名的几个发行版本。
红帽企业系统(RedHat Enterprise Linux, RHEL)
全球最大的开源技术厂商,全世界内使用最广泛的 Linux 发布套件,提供性能与稳定性 极强的 Linux 套件系统并拥有完善的全球技术支持。
官网: http://www.redhat.com
社区企业操作系统(CentOS)
最初是将红帽企业系统“重新编译/发布”给用户免费使用而广泛使用,当前已正式加 入红帽公司并继续保持免费(随 RHEL 更新而更新)。
官网: http://www.centos.org/
红帽用户桌面版(Fedora [Linux])
最初由红帽公司发起的桌面版系统套件(目前已经不限于桌面版),用户可免费体验到 最新的技术或工具,而功能成熟后加入到 RHEL 中。
官网: http://fedora.redhat.com
国际化组织的开源操作系统(Debian)
提供超过 37500 种不同的自由软件且拥有很高的认可度,对于各类内核架构支持性良 好,稳定性、安全性强更有免费的技术支持。
官网: http://www.debian.org/
基于 Debian 的桌面版(Ubuntu)
Ubuntu 是一款基于 Debian 派生的产品,对新款硬件具有极强的兼容能力。普遍认为 Ubuntu 与 Fedora 都是极其出色的 LINUX 桌面系统。
官网: http://www.ubuntulinux.org/
终端介绍
发出命令的载体
windows终端打开方式:windows win+R
Linux 终端打开方式:ctrl+alt+t
放大:ctrl shift + 放小:ctrl -
命令清屏: clear ctrl+l
命令手册
如何查看命令使用:man+命令
帮助手册,用来查看命令、系统调用,库函数等帮助信息
1:查看命令的帮助
2:查看可被内核调用的函数的函数的版主
3:查看函数和函数库的帮助
4:查看特殊文件的帮助(主要是/dev目录下的文件)
5:查看配置文件的帮助
6:查看游戏的帮助
7:查看其他杂项的帮助
8:查看系统管理员可用命令的帮助
9:查看和内核相关文件的帮助
开机与重启
shutdown -h now:立刻关机
halt:关机(需要切换为管理员模式,并且关闭之后需要手动关闭虚拟机)
init 0:关机
shutdown -r now:立刻重启
reboot:重启
init 6:重启
runlevel查看系统运行级别
可以用init动态切换0-6共7个级别
0 关机
1 单用户模式
2 多用户无网络服务
3 完全的多用户 文本界面
4 未定义或自定义
5 图形化界面
6 关机并重启
Linux目录结构
Linux中目录即Windows中文件夹
/:目录结构起始,根目录
Linux系统的目录结构是一颗倒状树,每个文件夹下存储的东西都是不同的。
常见目录说明
/bin存放常用命令
/boot系统内核及启动有关的文件
/dev 存放设备文件,广义上的文件,键盘鼠标都可以抽象为文件然后获取消息
/etc 存放系统配置文件,系统的运行相关的属性,参数等
/proc 这个目录是一个虚拟的目录,进程在内存中的信息映射成文件,到这个目录下。它是系统内存的映射,通过访问文件的形式访问内存信息。我们可以通过直接访问这个目录来获取系统信息。这个目录的内容不在硬盘上而是在内存里,我们也可以直接修改里面的某些文件
/mnt 临时挂载点,系统提供这个目录是让用户临时挂载别的文件系统
/lib 存放库文件,某个命令的实现
/tmp 存放各种临时文件,是所有用户均可访问的地点
/usr 存放系统应用程序及文档,用户安装的软件,或者运行时不经常改变的文件
/var 存放系统运行中常改变的文件,如系统日志
/home 所有普通用户的家目录
/root 管理员用户的家目录:权限更高
家目录:在多用户的系统下,让不同的用户和谐的使用计算机,在家目录下面创建一个和用户同名的文件夹,不同的用户不能访问别人目录下的文件。
路径
当前路径
当前路径:即用户当前所处路径。
pwd显示当前路径
. 代表当前路径
绝对路径与相对路径
绝对路径:是从系统根目录(“/”)开始到指定位置的路径
例如:以绝对路径表示 main.c的位置 /home/stu/main.c
相对路径:相对于/home/stu/main.c 去唯一标识的文件会把当前所处的目录当作你所相对的位置。是从当前目录开始到指定位置的相对路径
例如:“.”代表当前位置 “…”代表当前位置的上一层目录
“./main.c” 表示当前位置下的main.c文件
路径切换:
cd 后面添加相对路径或绝对路径。除此之外还有以下:
路径的地址(可以添加绝对路径或者相对路径)跳到指定目录
..退回到上级目录
~ 跳到自己的home目录
- 跳到之前所在的目录
查看目录下的文件
ls 查看当前目录下的文件
-a 显示所有文件及目录(ls内定将文件名或目录名称开头为“.”的视为隐藏档,不会列出)
-l 除文件名称外,亦将文件型态、权限、拥有者、文件大小等资讯详细列出
-r 将文件以相反次序显示(原定依英文字母次序)
-t 将文件以建立时间之先后次序列出
-A 同-a,但不列出“.”(目前目录)及“..”(父目录)
-F 在列出的文件名称后加一符号;例如可执行档则加“*”,目录则加“/”
-R 若目录下有文件,则以下之文件亦皆依序列出
家目录
创建一个普通用户之后,所有普通用户都在“/home”下以该用户的用户名创建了一个目录,该目录就是此用户的家目录。
例如:stu用户的家目录就是:/home/stu
每个用户只能在自己的家目录下创建文件、修改文件等。
管理员的家目录:/root
用户管理
添加新用户
useradd newname 添加一个新的用户 newname
创建新用户需要管理员身份,创建新用户成功后,会在/home下生产该用户的家目录。
-u 指定用户的uid 0:root用户 uid是Linux上唯一确定用户的标识,尽量不要用
-g 执行新用户的主组(初始组) 默认就是本身
-G 设置附加组 如果指定多个附加组可以用逗号隔开
-d 设置家目录(一般不用)
-c 备注
-s 指定命令解释器
-m 自动创建家目录
一般使用:useradd -C“ ” -G -m 用户名
初始组:产生就存在的一个组。这个组以用户名来命名
附加组:user1
切换用户
从user用户切换到root用户:sudo su然后输入root的密码就进入了root用户权限
切换到普通用户: su username 切换用户
修改用户密码
passwd 用户名
1、易记
2、复杂
3、经常更换
密码再加密
删除用户
userdel 删除用户时,首先确保该用户没有登录。userdel 默认仅删除用户,不会删除家目录
及家目录中的文件,若想删除用户的同时移除家目录, 那么使用 userdel -r username。
用户信息
/etc/passwd 存储用户基本信息
用户名:口令:用户标识号:组标识号:用户名:用户主目录:命令解释程序
(1)注册名(login_name):用于区分不同的用户。在同一系统中注册名是惟一的。在很多系统上,该字段被限制在8个字符(字母或数字)的长度之内;并且要注意,通常在Linux系统中对字母大小写是敏感的。这与MSDOS/Windows是不一样的。
(2)口令(密码)(passwd):系统用口令来验证用户的合法性。超级用户root或某些高级用户可以使用系统命令passwd来更改系统中所有用户的口令,普通用户也可以在登录系统后使用passwd命令来更改自己的口令。 现在的Unix/Linux系统中,口令不再直接保存在passwd文件中,通常将passwd文件中的口令字段使用一个“x”来代替,将/etc /shadow作为真正的口令文件,用于保存包括个人口令在内的数据。当然shadow文件是不能被普通用户读取的,只有超级用户才有权读取。
此外,需要注意的是,如果passwd字段中的第一个字符是“*”的话,那么,就表示该账号被查封了,系统不允许持有该账号的用户登录。
(3)用户标识号(UID):UID是一个数值,是Linux系统中惟一的用户标识,用于区别不同的用户。在系统内部管理进程和文件保护时使用 UID字段。在Linux系统中,注册名和UID都可以用于标识用户,只不过对于系统来说UID更为重要;而对于用户来说注册名使用起来更方便。在某些特 定目的下,系统中可以存在多个拥有不同注册名、但UID相同的用户,事实上,这些使用不同注册名的用户实际上是同一个用户。
不能重复。
0: 代表超级用户。
1-499: 代表系统用户。(伪用户)
500 ~ 65535 : 普通用户(我们使用的是从1000开始的)
(4)组标识号(GID)初始组:这是当前用户的缺省工作组标识。具有相似属性的多个用户可以被分配到同一个组内,每个组都有自己的组名,且以自己的组标 识号相区分。像UID一样,用户的组标识号也存放在passwd文件中。在现代的Unix/Linux中,每个用户可以同时属于多个组。除了在 passwd文件中指定其归属的基本组之外,还在/etc/group文件中指明一个组所包含用户。
初始组: 主组
附加组: 副组
-c
(5)用户名(user_name):用户的说明信息(-c所指定的信息)。包含有关用户的一些信息,如用户的真实姓名、办公室地址、联系电话等。在Linux系统中,mail和finger等程序利用这些信息来标识系统的用户。
(6)用户主目录(home_directory):该字段定义了个人用户的主目录,当用户登录后,他的Shell将把该目录作为用户的工作目录。 在Unix/Linux系统中,超级用户root的工作目录为/root;而其它个人用户在/home目录下均有自己独立的工作环境,系统在该目录下为每 个用户配置了自己的主目录。个人用户的文件都放置在各自的 主目录下。
(7)命令解释程序(Shell):Shell是当用户登录系统时运行的程序名称,通常是一个Shell程序的全 路径名,如/bin/bash
/etc/group 存储用户组的信息
第一字段:用户组名称; 也就是是用户组的名称,有字母或数字构成。同 /etc/passwd 中的用户名一样,组名也不能重复。
第二字段:用户组密码; 和 /etc/passwd 文件一样,这里的 “x” 仅仅是密码标识,真正加密后的组密码默认保存在 /etc/gshadow 文件中。
第三字段:GID 就是群组的 ID 号,Linux 系统就是通过 GID 来区分用户组的,同用户名一样,组名也只是为了便于管理员记忆。这里的组 GID 与 /etc/passwd 文件中第 4 个字段的 GID 相对应,实际上,/etc/passwd 文件中使用 GID 对应的群组名,就是通过此文件对应得到的。
第四字段:用户列表,每个用户之间用,号分割;本字段可以为空;如果字段为空表示用户组为GID的用户名;
/etc/shadow 存储用户的密码
我们可以先注意观察,shadow的权限的000,因为在其中存储真正的密码串,当然是加密好的/
用户名
同 /etc/passwd 文件的用户名有相同的含义。
加密密码
加盐 盐加密
这里保存的是真正加密的密码。目前 Linux 的密码采用的是 SHA512 散列加密算法,原来采用的是 MD5 或 DES 加密算法。SHA512 散列加密算法的加密等级更高,也更加安全。
注意,这串密码产生的乱码不能手工修改,如果手工修改,系统将无法识别密码,导致密码失效。很多软件透过这个功能,在密码串前加上 “!”、"" 或 “x” 使密码暂时失效。
所有伪用户的密码都是 “!!” 或 "",代表没有密码是不能登录的。当然,新创建的用户如果不设定密码,那么它的密码项也是 “!!”,代表这个用户没有密码,不能登录。
最后一次修改时间
此字段表示最后一次修改密码的时间,可是,为什么 root 用户显示的是 15775 呢?这是因为,Linux 计算日期的时间是以 1970 年 1 月 1 日作为 1 不断累加得到的时间,到 1971 年 1 月 1 日,则为 366 天。这里显示 15775 天,也就是说,此 root 账号在 1970 年 1 月 1 日之后的第 15775 天修改的 root 用户密码。
那么,到底 15775 代表的是哪一天呢?可以使用如下命令进行换算:
[root@localhost ~]# date -d “1970-01-01 15775 days”
2013年03月11日 星期一 00:00:00 CST
可以看到,通过以上命令,即可将其换算为我们习惯的系统日期。
最小修改时间间隔
最小修改间隔时间,也就是说,该字段规定了从第 3 字段(最后一次修改密码的日期)起,多长时间之内不能修改密码。如果是 0,则密码可以随时修改;如果是 10,则代表密码修改后 10 天之内不能再次修改密码。
此字段是为了针对某些人频繁更改账户密码而设计的。
密码有效期
经常变更密码是个好习惯,为了强制要求用户变更密码,这个字段可以指定距离第 3 字段(最后一次更改密码)多长时间内需要再次变更密码,否则该账户密码进行过期阶段。
该字段的默认值为 99999,也就是 273 年,可认为是永久生效。如果改为 90,则表示密码被修改 90 天之后必须再次修改,否则该用户即将过期(或者按照后面的字段处理)。管理服务器时,通过这个字段强制用户定期修改密码。
密码需要变更前的警告天数
与第 5 字段相比较,当账户密码有效期快到时,系统会发出警告信息给此账户,提醒用户 “再过 n 天你的密码就要过期了,请尽快重新设置你的密码!”。
该字段的默认值是 7,也就是说,距离密码有效期的第 7 天开始,每次登录系统都会向该账户发出 “修改密码” 的警告信息。
密码过期后的宽限天数
也称为“口令失效日”,简单理解就是,在密码过期后,用户如果还是没有修改密码,则在此字段规定的宽限天数内,用户还是可以登录系统的;如果过了宽限天数,系统将不再让此账户登陆,也不会提示账户过期,是完全禁用。
比如说,此字段规定的宽限天数是 10,则代表密码过期 10 天后失效;如果是 0,则代表密码过期后立即失效;如果是 -1,则代表密码永远不会失效。
账号失效时间
同第 3 个字段一样,使用自 1970 年 1 月 1 日以来的总天数作为账户的失效时间。该字段表示,账号在此字段规定的时间之外,不论你的密码是否过期,都将无法使用!
该字段通常被使用在具有收费服务的系统中。
保留
这个字段目前没有使用,等待新功能的加入。
修改用户信息
修改用户说明,修改用户副组
修改用户状态
Linux 系统下的文件类型与文件权限
文件类型
Linux下所有的东西(包括内存、网卡、外部设备等等)都可以看做文件,Linux将文件分为以下五种类型
a.普通文件 '-'
b.目录文件 'd'
c.管道文件 'p'
d.链接文件 'l'
e.设备文件(块设备'b'、字符设备'c'、套接字设备's')
linux只有通过命令才能查看出一个文件的类型:ls -l、ll:能查出隐藏文件
Linux上不以文件的扩展名区别文件类型,而是在文件属性中有一列专门记录文件类型。这五种文件在Linux上的呈现如下图所示:
第一部分:文件的类型和,权限。
第二部分:表示文件个数。如果是文件的话,那这个数目自然是1了,如果是 目录的话,那它的数目就是该目录中的文件个数了。
第三部分:表示该文件或目录的拥有者。
第四部分:表示所属的组(group)。
第五部分:表示文件大小。文件大小用byte来表示。
第六部分:表示创建日期。
第七部分:表示文件名。
文件权限
用户能够对其进行怎样的操作
a.r读权限 值:4
b.w写权限 值:2
c.x执行权限 值:1
d.-无权限 值:0
a.u:表示文件属主的访问权限,文件是谁建立的属主就是谁
b.g:表示文件同组同户的访问权限,用户进行分组
c.O:表示其他用户的访问权限,和创建文件的用户不是同一个组,一切皆文件。
修改文件权限
文字设定法:
chmod+u 表属主 g同组人 o其他人 a所有人 +增加权限 -去掉权限 文件路径/文件名
例:chmod u+w main.c
数字设定法:
修改文件的属组
sudo chgrp 所要修改为的属组 文件名
修改文件属主
sudo chown 所要修改为的属主 文件名
修改目录文件
同时修改属主和属组
sudo chown -R 所要修改为的属主:所要修改为的属组 文件名
文件操作
查看文件
ls 查看当前目录下的文件
-a 显示所有文件及目录 (ls内定将文件名或目录名称开头为"."的视为隐藏档,不会列出)
-l 除文件名称外,亦将文件型态、权限、拥有者、文件大小等资讯详细列出
-r 将文件以相反次序显示(原定依英文字母次序)
-t 将文件依建立时间之先后次序列出
-A 同 -a ,但不列出 "." (目前目录) 及 ".." (父目录)
-F 在列出的文件名称后加一符号;例如可执行档则加 "*", 目录则加 "/"
-R 若目录下有文件,则以下之文件亦皆依序列出
创建文件
touch+文件路径/文件名 创建普通文件
文件路径可以是相对路径也可以是绝对路径
mkdir+目录路径/目录名 创建目录文件
删除文件
删除普通文件
rm+文件路径/文件名 删除普通文件
删除目录文件
-f, --force 忽略不存在的文件,从不给出提示。
-i, --interactive 进行交互式删除
-r, -R, --recursive 指示rm将参数中列出的全部目录和子目录均递归地删除。
-v, --verbose 详细显示进行的步骤
--help 显示此帮助信息并退出
--version 输出版本信息并退出
删除空目录
rmdir + 目录路径/目录名
rm -r +目录路径/ 目录名 -r 是rm的参数
删除非空目录
rm -r +目录路径/ 目录名
注意:rm -rf * 禁用 rm -rf /*
文件复制与重命名
复制粘贴使用cp
语法: cp [options] source... directory
• -a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。其作用等于dpR参数组合。
• -d:复制时保留链接。这里所说的链接相当于Windows系统中的快捷方式。
• -f:覆盖已经存在的目标文件而不给出提示。
• -i:与-f选项相反,在覆盖目标文件之前给出提示,要求用户确认是否覆盖,回答"y"时目标文件将被覆盖。
• -p:除复制文件的内容外,还把修改时间和访问权限也复制到新文件中。
• -r:若给出的源文件是一个目录文件,此时将复制该目录下所有的子目录和文件。
• -l:不复制文件,只是生成链接文件。
移动文件或者重命名使用mv
语法:mv [options] source... directory
• -i: 若指定目录已有同名文件,则先询问是否覆盖旧文件;
• -f: 在 mv 操作要覆盖某已有的目标文件时不给任何指示;
压缩、打包
我们使用tar进行打包或者解包。使用gizp进行文件压缩。
打包
将文件打包或者解包
◼ c 创建包文件
◼ f 指定目标为文件而不是设备
◼ v 显示详细过程
◼ t 显示包中的内容而不释放
◼ x 释放包中的内容
◼ z GNU 版本新加的,使得 tar 有压缩和解压的功能
下图为解包过程:
压缩
下图为gzip压缩的过程:
下图为gzip解压的过程
下图为 tar 对 xxx.tgz 或 xxx.tar.gz 压缩包一步解压的过程
Linux 文件操作命令
文件查看命令
cat
查看文件内容
cat 文件名
合并文件
cat 文件名1 文件名2 > 文件名3
往文件中写入数据,Ctrl+d是结束输入(原文件内容会被覆盖)
more
当一个文件的内容超过一个屏幕能显示的行数,使用more可以分屏显示文件内容。
使用方式:more filename
less
文本内容查看器,查看文件内容但是文件内容不会显示到界面上
head
显示文件前n行的内容
tail
显示文件后n行的内容
数据统计
wc
统计文件中单词个数(-w)、字符个数(-c)、行数(-l)
文件编辑命令
VIM命令
三种模式介绍
vim一共有三种模式,我们可以在不同的模式下做不同的操作。
命令模式切换到插入模式:
1. a //进入到当前光标后开始编辑
2. A //进入到当前光标所在行的行末开始编辑
3. i //进入当前光标位置开始编辑
4. I //进入当前光标所在行的行头开始编辑
5. o //进入当前光标下一行开始编辑
6. O //进入当前光标上一行开始编辑
命令模式切换到末行模式
1. : //对文本的设置或保存工作
2. / //对文本进行全文向下搜索字符串 string
3. ? //对文本进行全文向上搜索字符串 string
vi/vim 常用命令
1. n dd //删除光标开始向下的 n 行
2. n yy //拷贝光标开始向下的 n 行
3. p //粘贴
4. u //撤销上一次操作
5. ctrl + r // 恢复上一次撤销操作
6. r //替换一个字符
7. shift + 6 //光标移动到当前行的行头
8. shift + 4 //光标移动到当前行的行尾
9. shift + g //光标移动到整个文本的最后一行 G
10. gg //光标移动到整个文本的第一行
11. n shift + g //光标移动到第 n 行
12. d n shift + g //删除光标到 n 行的内容
13. y n shift + g //拷贝光标到 n 行的内容
末行模式下的操作
1. :w //保存文本
2. :q //退出编辑
3. :wq //保存并退出
4. :q! //强制退出
5. :w newfile //另存为
6. :set nu //显示行号
7. :set nonu //取消行号
8. : set hlsearch //设置高亮搜索
9. : set nohlsearch //取消高亮搜索
10. : n,m s/oldstring/newstring //替换整个文本每行的第一个 oldstring
11. :n, m s/oldstring/newstirng/g //替换整个文本所有的 oldstring
12. /string //向下搜索 string
13. ?string //向上搜索 strin
vim小技巧
定位命令
删除命令
复制粘贴命令
替换和取消命令
保存或退出命令
查找与替换
最后+g替换时不询问
+c替换时询问
恢复上一次撤销操作
ctrl+r
导入另外一个文件的内容:
esc :r 文件名
导入另外一个命令的执行结果:
esc :r 命令名
vim中的快捷操作
vim配置文件
在用户家目录输入: vim .vimrc
输入一些编辑模式的命令:比如设置行号,设置快捷键
基础命令
find
find 路径 -查找方式 文件名
在目录树中搜索指定的文件,也可以指定开始的搜索位置
-mount, -xdev : 只检查和指定目录在同一个文件系统下的文件,避免列出其它文件系统中的文件
-amin n : 在过去 n 分钟内被读取过
-anewer file : 比文件 file 更晚被读取过的文件
-atime n : 在过去n天内被读取过的文件
-cmin n : 在过去 n 分钟内被修改过
-cnewer file :比文件 file 更新的文件
-ctime n : 在过去n天内被修改过的文件
-empty : 空的文件-gid n or -group name : gid 是 n 或是 group 名称是 name
-ipath p, -path p : 路径名称符合 p 的文件,ipath 会忽略大小写
-name name, -iname name : 文件名称符合 name 的文件。iname 会忽略大小写
-size n : 文件大小 是 n 单位,b 代表 512 位元组的区块,c 表示字元数,k 表示 kilo bytes,w 是二个位元组。
-type c : 文件类型是 c 的文件。
d: 目录
c: 字型装置文件
b: 区块装置文件
p: 具名贮列
f: 一般文件
l: 符号连结
s: socket
find常考面试题:
https://www.cnblogs.com/Ido-911/p/9638612.html
grep
在文件中过滤出包含指定字符串的行
-a 或 --text : 不要忽略二进制的数据。
-A<显示行数> 或 --after-context=<显示行数> : 除了显示符合范本样式的那一列之外,并显示该行之后的内容。
-b 或 --byte-offset : 在显示符合样式的那一行之前,标示出该行第一个字符的编号。
-B<显示行数> 或 --before-context=<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前的内容。
-c 或 --count : 计算符合样式的列数。
-C<显示行数> 或 --context=<显示行数>或-<显示行数> : 除了显示符合样式的那一行之外,并显示该行之前后的内容。
-d <动作> 或 --directories=<动作> : 当指定要查找的是目录而非文件时,必须使用这项参数,否则grep指令将回报信息并停止动作。
-e<范本样式> 或 --regexp=<范本样式> : 指定字符串做为查找文件内容的样式。
-E 或 --extended-regexp : 将样式为延伸的正则表达式来使用。
-f<规则文件> 或 --file=<规则文件> : 指定规则文件,其内容含有一个或多个规则样式,让grep查找符合规则条件的文件内容,格式为每行一个规则样式。
-F 或 --fixed-regexp : 将样式视为固定字符串的列表。
-G 或 --basic-regexp : 将样式视为普通的表示法来使用。
-h 或 --no-filename : 在显示符合样式的那一行之前,不标示该行所属的文件名称。
-H 或 --with-filename : 在显示符合样式的那一行之前,表示该行所属的文件名称。
-i 或 --ignore-case : 忽略字符大小写的差别。
-l 或 --file-with-matches : 列出文件内容符合指定的样式的文件名称。
-L 或 --files-without-match : 列出文件内容不符合指定的样式的文件名称。
-n 或 --line-number : 在显示符合样式的那一行之前,标示出该行的列数编号。
-o 或 --only-matching : 只显示匹配PATTERN 部分。
-q 或 --quiet或--silent : 不显示任何信息。
-r 或 --recursive : 此参数的效果和指定"-d recurse"参数相同。
-s 或 --no-messages : 不显示错误信息。
-v 或 --revert-match : 显示不包含匹配文本的所有行。
-V 或 --version : 显示版本信息。
-w 或 --word-regexp : 只显示全字符合的列。
-x --line-regexp : 只显示全列符合的列。
-y : 此参数的效果和指定"-i"参数相同。
计算机组成与进程
计算机组成五大部件
(1) 运算器 :也叫算数逻辑单元,完成对数据的各种常规运算,如加减乘除,也包括逻辑运 算,移位,比较等。
(2) 控制器 :它是整个计算机系统的控制中心,它指挥计算机各部分协调地工作,保证计算 机按照预先规定的目标和步骤有条不紊地进行操作及处理。
(3) 存储器 :存储程序和各种数据。
(4) 输入设备 :把人所熟悉的信息如,图片,声音,文字,转换为计算机能够识别的信息存 储起来。
(5) 输出设备 : 把计算机机能识别的信息转换为人能识别的信息,进行呈现。 一台计算机可以抽象成下图: CPU 中包含控制器和运算器, 内存就是存储器。I/O 设 备就是输入设备和输出设备,如:键盘、显示器、鼠标、硬盘、网卡
系统总线
(1)数据总线:用来在各个功能部件中间传输数据,是双向传输总线
(2) 地址总线 :用来指出数据总线上的源数据或目的数据在主存单元的地址或 io 设备的地 址。
(3) 控制总线 :由于各个连接在数据总线和地址总线的部件都是共享这两类总线的,那么在某一时刻由谁来使用,就是控制总线负责完成的。
指令
(1) 指令 : 是指示计算机执行某种操作的命令。一条指令通常由两部分构成:地址码 和操 作码。
(2) 程序 : 由一条一条的指令构成。
(3) 指令周期 :cpu 每取出并执行一条指令所需的全部时间称为指令周期。
(4) 指令系统 :计算机能够执行的全部指令的集合称为该计算机的指令系统。
(5) RISC :精简指令系统计算机。
(6) CISC :复杂指令系统计算机。
(7) 程序与指令:高级语言 汇编助记符 机器指令
进程
什么是进程?
运行起来的程序。
进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。
什么是线程?
线程(英语:thread)是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。进程内部至少有一个线程。
什么是程序?
PID
PID(Process Identification)操作系统里指进程识别号,也就是进程标识符。操作系统里每打开一个程序都会创建一个进程ID,即PID。
PID(进程控制符)英文全称为Process Identifier,它也属于电工电子类技术术语。
PID是各进程的代号,每个进程有唯一的PID编号。它是进程运行时系统随机分配的,并不代表专门的进程。在运行时PID是不会改变标识符的,但是你终止程序后再运行PID标识符就会被系统回收,就可能会被继续分配给新运行的程序。
含义
只要运行一程序,系统会自动分配一个标识。
是暂时唯一:进程中止后,这个号码就会被回收,并可能被分配给另一个新进程。
PCB
进程控制块,进程的属性信息。
在操作系统中会使用链表将PCB连接在一起,
链表中有多少个节点,这个操作系统就有多少个进程,操作系统通过管理PCB来管理运行起来的 进程
进程描述信息:
• 进程标识符用于唯一的标识一个进程(pid,ppid)。
进程控制信息:
• 进程当前状态
• 进程优先级
• 程序开始地址
• 各种计时信息
• 通信信息
资源信息:
• 占用内存大小及管理用数据结构指针
• 交换区相关信息
• I/O设备号、缓冲、设备相关的数结构
• 文件系统相关指针
现场保护信息(cpu进行进程切换时):
• 寄存器
• PC
• 程序状态字PSW
• 栈指针
进程状态
就绪、运行、阻塞
a. ready:表示线程已经被创建,正在等待系统调度分配CPU使用权。
b. running:表示线程获得了CPU使用权,正在进行运算
c. waiting:表示线程等待(或者说挂起),让出CPU资源给其他线程使用
为什么除去new和terminated状态?
是因为这两种状态实际上并不存在于线程运行中,所以也没什么实际讨论的意义。对于Java中的线程状态无论是Timed Waiting ,Waiting还是Blocked,对应的都是操作系统线程的waiting(等待)状态。而Runnable状态,则对应了操作系统中的ready和running状态。
进程管理命令
ps
只显示当前终端的进程,默认显示与当前终端有关的进程信息。
-A 列出所有的进程
-e 等于“-A”
-a 显示现行终端机下的所有进程,包括其他用户的进程;
-u 以用户为主的进程状态 ;
x 通常与 a 这个参数一起使用,可列出较完整信息。
-w 显示加宽可以显示较多的资讯
-au 显示较详细的资讯
-aux 显示所有包含其他使用者的行程
-f 做一个更为完整的输出。
-L 显示进程中的线程 ID
显示所有进程信息,连带命令行
ps与grep组合法。打印指定进程信息
最常用的命令:
ps -aux
USER 表示哪个用户启动了这个进程;
PID 表示进程的ID;
%CPU 表示cpu的占用率;占用越高,进程越消耗资源。
%MEM 表示内存的使用率;占用越高,进程越消耗资源。
VSZ 如果一个程序完全驻留在内存中一共需要会用多少内存;(该进程所占的虚拟内存大小,单位kb)
RSS 表示进程当前实际上占用了多少内存,注意不要跟VSZ混淆,VSZ的前提是进程完全驻留在内存中;该进程所占的物理内存大小,单位kb)
TTY 表示tty终端;tty1-tty7代表本地控制台终端,tty1-tty6是本地的字符结面终端,tty是图形终端。ps/0-256代表虚拟终端。
STAT 表示当前进程的状态,(S表示处于休眠状态,D表示不可中断的状态,Z表示僵尸进程,X表示死掉的进程);
START 启动这个命令的时间点;
TIME 进程执行起到现在总的CPU占用时间;
COMMAND 表示启动这个进程的命令
ps -ef
UID: 说明该程序被谁拥有(用户ID)
PID:就是指该程序的 ID(进程ID)
PPID: 就是指该程序父级程序的 ID(父进程号)
C: 指的是 CPU 占用率
STIME: 程序的启动时间
TTY: 指的是登录终端
TIME : 表示进程执行起到现在总的CPU占用时间
CMD: 启动这个进程的命令,它其实就是一个启动进程的命令
pstree
pstree命令以树状图显示进程间的关系(display a tree of processes)。ps命令可以显示当前正在运行的那些进程的信息,但是对于它们之间的关系却显示得不够清晰。在Linux系统中,系统调用fork可以创建子进程,通过子shell也可以创建子进程,Linux系统中进程之间的关系天生就是一棵树,树的根就是进程PID为1的init进程。
以树状图形式显示进程之间的关系
pstree -p
pstree [-p]
jobs
显示当前终端的任务
sleep
睡眠n秒
&
后台运行程序
fg bg
fg %任务号 将后台运行的或挂起的进程挪到前台执行
bg %任务号 将挂起的进程唤醒到后台执行
kill
结束或者挂起一个进程
-9 强制结束进程
-stop 挂起进程
pkill
结束一组同名的进程
pkill [选项][信号]进程名
-t 按照终端号提出用户。
killAll
顾名思义杀死所有
killall [选项][信号]进程名
-i 交互式,询问是否要杀死某个进程。
-I 忽略进程名的大小写。
top
查看系统资源使用情况以及进程信息
前五行信息:
统计信息区
第一行:任务队列信息,与uptime命令执行结果相同。
• 17:25:29:系统当前时间
• up 1:10:主机已运行时间
• 1 users:用户连接数(不是用户数,who命令)
• load average: 0.00, 0.00, 0.00:系统平均负载,统计最近1,5,15分钟的系统平均负载,三个值相加 /3 * 100% 判断结果和 60%比较
补充:uptime -V可查询版本
• 第二行:进程信息
• Tasks: 287 total:进程总数
• 1 running:正在运行的进程数
• 146 sleeping:睡眠的进程数
• 0 stopped:停止的进程数
• 0 zombie:僵尸进程数
• 第三行:CPU信息(当有多个CPU时,这些内容可能会超过两行)
• 1.7 us:用户空间所占CPU百分比
• 3.3sy:内核空间占用CPU百分比
• 0.0 ni:用户进程空间内改变过优先级的进程占用CPU百分比
• 94.2 id:空闲CPU百分比
• 0.0 wa:等待输入输出的CPU时间百分比
• 0.0 hi:硬件CPU中断占用百分比
• 0.0 si:软中断占用百分比
• 0.0 st:虚拟机占用百分比
第四行:内存信息(与第五行的信息类似与free命令)
• 1021564 total:物理内存总量
• 93224 used:已使用的内存总量
• 51540 free:空闲的内存总量(free+used=total)
• 416800 buffers:用作内核缓存的内存量
• 第五行:swap信息
• 998396 total:交换分区总量
• 996852 free:空闲交换区总量 used:已使用的交换分区总量
• 1544 used:已使用的交换分区总量
• 351844 cached Mem:缓冲的交换区总量,内存中的内容被换出到交换区,然后又被换入到内存,但是使用过的交换区没有被覆盖,交换区的这些内容已存在于内存中的交换区的大小,相应的内存再次被换出时可不必再对交换区写入。
PID:进程ID,进程的唯一标识符
USER:进程所有者的实际用户名。
PR:进程的调度优先级。这个字段的一些值是’rt’。这意味这这些进程运行在实时态。
NI:进程的nice值(优先级)。越小的值意味着越高的优先级。负值表示高优先级,正值表示低优先级
VIRT:进程使用的虚拟内存。进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES:驻留内存大小。驻留内存是任务使用的非交换物理内存大小。进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA
SHR:SHR是进程使用的共享内存。共享内存大小,单位kb
S:这个是进程的状态。它有以下不同的值:
• D - 不可中断的睡眠态。
• R – 运行态
• S – 睡眠态
• T – 被跟踪或已停止
• Z – 僵尸态
%CPU:自从上一次更新时到现在任务所使用的CPU时间百分比。
%MEM:进程使用的可用物理内存百分比。
TIME+:任务启动后到现在所使用的全部CPU时间,精确到百分之一秒。
COMMAND:运行进程所使用的命令。进程名称(命令名/命令行)
还有许多在默认情况下不会显示的输出,它们可以显示进程的页错误、有效组和组ID和其他更多的信息。
如果查看进程cpu的使用相关信息也可以使用pidstat -u
详细说明
PID:进程ID
%usr:进程在用户空间占用cpu的百分比
%system:进程在内核空间占用cpu的百分比
%guest:进程在虚拟机占用cpu的百分比
%CPU:进程占用cpu的百分比
CPU:处理进程的cpu编号
Command:当前进程对应的命令
pidstat的用法
pidstat [ 选项 ] [ <时间间隔> ] [ <次数> ]
常用的参数:
-u:默认的参数,显示各个进程的cpu使用统计
-r:显示各个进程的内存使用统计
-d:显示各个进程的IO使用情况
-p:指定进程号
-w:显示每个进程的上下文切换情况
-t:显示选择任务的线程的统计信息外的额外信息
-T { TASK | CHILD | ALL }
这个选项指定了pidstat监控的。TASK表示报告独立的task,CHILD关键字表示报告进程下所有线程统计信息。ALL表示报告独立的task和task下面的所有线程。
注意:task和子线程的全局的统计信息和pidstat选项无关。这些统计信息不会对应到当前的统计间隔,这些统计信息只有在子线程kill或者完成的时候才会被收集。
-V:版本号
-h:在一行上显示了所有活动,这样其他程序可以容易解析。
-I:在SMP环境,表示任务的CPU使用率/内核数量
-l:显示命令名和所有参数
实例:显示每个进程的上下文切换情况(-w)
PID:进程id
Cswch/s:每秒主动任务上下文切换数量
Nvcswch/s:每秒被动任务上下文切换数量
Command:命令名
生产环境服务器变慢,诊断思路和性能评估
结合linux和jdk命令一起分析:
• 使用top命令找出CPU占比最高的
• ps -ef 或者 jps 进一步定位,得知是一个怎么样的后台程序出的问题
• 定位到具体线程或者代码
• ps -mp 进程 -o THREAD,tid,time
• 参数解释
• -m:显示所有的线程
• -p:pid进程使用CPU的时间
• -o:该参数后是用户自定义格式
• 将需要的线程ID转换为16进制格式(英文小写格式)
• printf “%x\n” 有问题的线程ID
• jstack 进程ID | grep tid(16进制线程ID小写英文) -A60
精准定位到错误的地方
内存与磁盘
内存和磁盘都是计算机中的存储器,都具有存储功能,属于存储设备。在计算机中,磁盘和内存是相互配合共同作业的。
区别:
1、内存是一种高速,造价昂贵的存储设备;而磁盘速度较慢、造价低廉。
2、内存属于内部存储设备,磁盘属于外部存储设备。
3、内存是通过电流来实现存储;磁盘是通过磁记录来实现存储。所以电脑断电后,内存中的数据会丢失,而磁盘中的数据可以长久保留。
内存
内存是程序与CPU进行沟通的桥梁。计算机中所有程序的运行都是在内存中进行的。其作用是存放CPU中的运算数据,以及与硬盘等外部存储设备交换的数据。只要计算机在运行中,CPU就会把需要运算的数据调到内存中进行运算,当运算完成后CPU再将结果传送出来,内存的运行也决定了计算机的稳定运行。
磁盘
磁盘(disk)是指利用磁记录技术存储数据的存储器。
磁盘是计算机主要的存储介质,可以存储大量的二进制数据,并且断电后也能保持数据不丢失。早期计算机使用的磁盘是软磁盘(Floppy Disk,简称软盘),如今常用的磁盘是硬磁盘(Hard disk,简称硬盘)。
磁盘是一个块设备,可以划分为不同的分区;在分区之上再创建文件系统,挂载到某个目录,之后才可以在这个目录中读写文件
内存管理相关命令
内存:free
常见用法
free -h //以更友好的方式显示,会以K、M、G为单位来显示
free -m //以M单位打印结果
Mem:内存使用情况。
Swap:交换空间(虚拟内存)使用情况。
total:系统总共可用物理内存、交换空间大小。
used:已经被使用的物理内存、交换空间大小。
free:剩余可用物理内存、交换空间大小。
shared:被共享使用的物理内存大小。
buff/cache:被 buffer 和 cache 使用的物理内存大小。
• buffers:用于存放要输出到disk(块存储)的数据,在这里buff是指被OS buffer住的内存(written to disk);
• cached:存放从disk上读出的数据;buffer和cache是为了提高IO性能并由OS管理。
available:还可以被应用程序使用的物理内存大小。
注意
应用程序可用内存/系统物理内存 > 70% 内存充足
应用程序可用内存/系统物理内存 < 20% 内存不足,需要增加内存
20% < 应用程序可用内存/系统物理内存 < 70%,表示内存基本够用
vmstat命令
vmstat 是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作系统的虚拟内存、进程、CPU活动进行监控,是对系统的整体情况进行的统计。
一般vmstat工具的使用是通过两个数字参数来完成的,第一个参数是采样的时间间隔数(单位秒),第二个参数是采样的次数
一 为什么需要使用虚拟内存
大家都知道,进程需要使用的代码和数据都放在内存中,比放在外存中要快很多。问题是内存空间太小了,不能满足进程的需求,而且现在都是多进程,情况更加糟糕。所以提出了虚拟内存,使得每个进程用于3G的独立用户内存空间和共享的1G内核内存空间。(每个进程都有自己的页表,才使得3G用户空间的独立)这样进程运行的速度必然很快了。而且虚拟内存机制还解决了内存碎片和内存不连续的问题。为什么可以在有限的物理内存上达到这样的效果呢?
二 虚拟内存的实现机制
首先呢,提一个概念,交换空间(swap space),这个大家应该不陌生,在重装系统的时候,会让你选择磁盘分区,就比如说一个硬盘分几个部分去管理。其中就会分一部分磁盘空间用作交换,叫做swap space。其实就是一段临时存储空间,内存不够用的时候就用它了,虽然它也在磁盘中,但省去了很多的查找时间啊。当发生进程切换的时候,内存与交换空间就要发生数据交换一满足需求。所以啊,进程的切换消耗是很大的,这也说明了为什么自旋锁比信号量效率高的原因。
memory列
swpd:使用的虚拟内存大小。
free:空闲物理内存大小。
buff:buffer cache内存大小。
cache:page cache的内存大小。
swap列
si:每秒从交换区读入到内存的大小,由磁盘调入内存(单位:kb/s)
so:每秒从内存写出到交换区的大小,由内存调入磁盘(单位:kb/s)
以上是与内存相关的两列。
procs
r:运行和等待的CPU时间片的进程数,原则上1核的CPU的运行队列不要超过2,整个系统的运行队列不超过总核数的2倍,否则代表系统压力过大。
b:等待资源的进程数,比如正在等待磁盘I/O、网络I/O等
cpu
us:用户进程消耗CPU时间百分比,us值高,用户进程消耗CPU时间多,如果长期大于50%,优化程序
sy:内核进程消耗的CPU时间百分比
我们还可以使用pidstat -r来查看内存使用情况
PID: 进程标识符
minflt/s: 每秒次缺页错误次数(minor page faults),次缺页错误次数意即虚拟内存地址映射成物理内存地址产生的page fault次数
majflt/s: 每秒主缺页错误次数(major page faults),当虚拟内存地址映射成物理内存地址时,相应的page在swap中,这样的page fault为major page fault,一般在内存使用紧张时产生
VSZ: 该进程使用的虚拟内存(以kB为单位)
RSS: 该进程使用的物理内存(以kB为单位)
%MEM: 该进程使用内存的百分比
Command: task命令名
查看磁盘信息
查看硬盘磁盘IO
每两秒取样一次,一共取样三次
磁盘块设备分布:
rkB /s:每秒读取数据量kB;
wkB/s:每秒写入数据量kB;
svctm I/O:请求的平均服务时间,单位毫秒
await I/O:请求的平均等待时间,单位毫秒,值越小,性能越好
util:一秒钟有百分几的时间用于I/O操作。接近100%时,表示磁盘带宽跑满,需要优化程序或者增加磁盘;
rkB/s,wkB/s根据系统应用不同会有不同的值,但有规律遵循:长期、超大数据读写,肯定不正常,需要优化程序读取。
svctm的值与await的值很接近,表示几乎没有I/O等待,磁盘性能好,如果await的值远高于svctm的值,则表示I/O队列等待太长,需要优化程序或更换更快磁盘
通过pidstat -d也可以查看磁盘IO信息
PID:进程id
kB_rd/s:每秒从磁盘读取的KB
kB_wr/s:每秒写入磁盘KB
kB_ccwr/s:任务取消的写入磁盘的KB。当任务截断脏的pagecache的时候会发生。
iodelay:任务的I/O阻塞延迟,以时钟周期为单位,包括等待同步块 I/O 和换入块 I/O 结束的时间
COMMAND:task的命令名
网络
Ping
ping 命令是用来测试TCP/IP 网络是否畅通或者测试网络连接速度的命令,对确定网络是否正确连接,以及网络连接的状况十分有用。简单的说,ping就是一个测试程序,如果ping运行正确,大体上就可以排除网络访问层、网卡、Modem的输入输出线路、电缆和路由器等存在的故障,从而缩小问题的范围。
ping命令的原理是根据计算机唯一标示的IP 地址,当用户给目的地址发送一个数据包时,对方就会返回一个同样大小的数据包,根据返回的数据包用户可以确定目的主机的存在,并初步判断目的主机的操作系统。
ifconfig
ifconfig命令被用于配置和显示Linux内核中网络接口的网络参数。用ifconfig命令配置的网卡信息,在网卡重启后机器重启后,配置就不存在。要想将上述的配置信息永远的存的电脑里,那就要修改网卡的配置文件了。
eth0表示第一块网卡,可以看到这个网卡的信息
• HWaddr表示网卡的物理地址即MAC地址,可以看到目前这个网卡的MAC地址是:00:0c:29:ec:66:ff
• inet addr用来表示网卡的IP地址,此网卡的IP地址是:192.168.62.130
• 广播地址Bcast:192.168.62.255
• 掩码地址Mask:255.255.255.0
lo是表示主机的回环地址,这个一般是用来测试一个网络程序,但又不想让局域网或外网的用户能够查看,只能在此台主机上运行和查看所用的网络接口。
netstat
netstat命令用于显示与IP、TCP、UDP和ICMP协议相关的统计数据,一般用于检验本机各端口的网络连接情况。netstat是在内核中访问网络及相关信息的程序,它能提供TCP连接,TCP和UDP监听,进程内存管理的相关报告。
-t : TCP协议
-u: UDP协议
-r : 路由
-l: 监听
-n: 显示IP地址和端口号
-p或–programs:显示正在使用Socket的程序识别码和程序名称;
Proto:协议名(tcp协议还是udp协议)
recv-Q:网络接收队列
表示收到的数据已经在本地接收缓冲,但是还有多少没有被进程取走,recv()
如果接收队列Recv-Q一直处于阻塞状态,可能是遭受了拒绝服务 denial-of-service 攻击。
send-Q:网路发送队列
对方没有收到的数据或者说没有Ack的,还是本地缓冲区.
如果发送队列Send-Q不能很快的清零,可能是有应用向外发送数据包过快,或者是对方接收数据包不够快。
这两个值通常应该为0,如果不为0可能是有问题的。packets在两个队列里都不应该有堆积状态。可接受短暂的非0情况。
从步骤一的结果中可以看到22端口对应的链路的 send-Q中堆积了大量的数据包 ,可以判定是发送数据给目的地址的时候出现了阻塞的问题,导致了包堆积在本地缓存中,不能成功发出去。
2.2 Local Address 解释
1)Local Address 部分的0.0.0.0:22 表示监听服务器上所有ip地址的所有(0.0.0.0表示本地所有ip),比如你的服务器是有172.172.230.210和172.172.230.11两个ip地址,那么0.0.0.0:22此时表示监听172.172.230.210,172.172.230.211,127.0.0.1三个地址的22端口
2):::22 这个也表示监听本地所有ip的22端口,跟上面的区别是这里表示的是IPv6地址,上面的0.0.0.0表示的是本地所有IPv4地址
NOTE
“:::” 这三个: 的前两个"::",是"0:0:0:0:0:0:0:0"的缩写,相当于IPv6的"0.0.0.0",就是本机的所有IPv6地址,第三个:是IP和端口的分隔符
3)127.0.0.1:631 这个表示监听本机的loopback地址的631端口(如果某个服务只监听了回环地址,那么只能在本机进行访问,无法通过tcp/ip 协议进行远程访问)
4)::1:631 这个表示监听IPv6的回环地址的631端口,::1这个表示IPv6的loopback地址
5)172.172.230.211:3306 这里我们看到我们的mysqld进程监听的是172.172.230.211的3306端口,这是因为我们在启动的时候指定了bind_address=172.172.230.211参数,如果不指定bind_address的话,mysqld默认监听:::3306(本机所有ip地址的3306端口 -IPv6)
2.3 Foreign Address
与本机端口通信的外部socket。显示规则与Local Address相同
2.4 State
链路状态,共有11种
state列共有12中可能的状态,前面11种是按照TCP连接建立的三次握手和TCP连接断开的四次挥手过程来描述的。
状态 | 描述 |
---|---|
LISTEN | 首先服务端需要打开一个socket进行监听,状态为LISTEN./* The socket is listening for incoming connections. 侦听来自远方TCP端口的连接请求 */ |
SYN_SENT | 客户端通过应用程序调用connect进行active open.于是客户端tcp发送一个SYN以请求建立一个连接.之后状态置为SYN_SENT./*The socket is actively attempting to establish a connection. 在发送连接请求后等待匹配的连接请求 */ |
SYN_RECV | 服务端应发出ACK确认客户端的 SYN,同时自己向客户端发送一个SYN. 之后状态置为SYN_RECV/* A connection request has been received from the network. 在收到和发送一个连接请求后等待对连接请求的确认 */ |
ESTABLISHED | 代表一个打开的连接,双方可以进行或已经在数据交互了。/* The socket has an established connection. 代表一个打开的连接,数据可以传送给用户 */ |
FIN_WAIT1 | 主动关闭(active close)端应用程序调用close,于是其TCP发出FIN请求主动关闭连接,之后进入FIN_WAIT1状态./* The socket is closed, and the connection is shutting down. 等待远程TCP的连接中断请求,或先前的连接中断请求的确认 */ |
CLOSE_WAIT | 被动关闭(passive close)端TCP接到FIN后,就发出ACK以回应FIN请求(它的接收也作为文件结束符传递给上层应用程序),并进入CLOSE_WAIT./* The remote end has shut down, waiting for the socket to close. 等待从本地用户发来的连接中断请求 */ |
FIN_WAIT2 | 主动关闭端接到ACK后,就进入了 FIN-WAIT-2 ./* Connection is closed, and the socket is waiting for a shutdown from the remote end. 从远程TCP等待连接中断请求 */ |
LAST_ACK | 被动关闭端一段时间后,接收到文件结束符的应用程 序将调用CLOSE关闭连接。这导致它的TCP也发送一个 FIN,等待对方的ACK.就进入了LAST-ACK ./* The remote end has shut down, and the socket is closed. Waiting for acknowledgement. 等待原来发向远程TCP的连接中断请求的确认 */ |
TIME_WAIT | 在主动关闭端接收到FIN后,TCP 就发送ACK包,并进入TIME-WAIT状态。/* The socket is waiting after close to handle packets still in the network.等待足够的时间以确保远程TCP接收到连接中断请求的确认 */ |
CLOSING | 比较少见./* Both sockets are shut down but we still don’t have all our data sent. 等待远程TCP对连接中断的确认 */ |
CLOSED | 被动关闭端在接受到ACK包后,就进入了closed的状态。连接结束./* The socket is not being used. 没有任何连接状态 */ |
UNKNOWN | 未知的Socket状态。/* The state of the socket is unknown. */ |
2.5 PID/Program
PID即进程id,Program即使用该socket的应用程序