【Linux学习笔记】十一、linux资源管理2

(5)lsof命令
lsof, list open files,列出当前系统打开文件的工具。这个工具也需要安装:yum install lsof -y

  • 常用参数:

-c 指定进程名,打开了哪些系统文件,例如:lsof -c nginx
-i 显示符合条件的进程
-p 显示pid打开的文件
-u 显示指定用户uid打开的文件,以及具体进程信息
+d 显示文件夹下被打开的文件有哪些,比如,lsof +d /var/log/nginx
+D 递归列出目录下哪些文件被进程打开
-n 不显示主机名,直接显示ip
-P 不显示端口名,直接显示端口号
-s 列出文件大小

  • 看当前用户打开了哪些文件?
  • 看某个服务、程序、命令、进程都打开了哪些文件?

以nginx为例: 

以vim为例:

lsof命令可以基于命令、基于进程id号、基于服务名、基于程序名,显示出都打开了什么文件。
除此之外,lsof命令还可以反着查,就是基于某个文件,看哪个进程调用了这个文件!

  • 看某个文件被哪个命令、进程、服务或程序调用了

lsof命令延申出的一个小知识:巧妙恢复被删记录
以nginx为例,我们删除nginx的日志文件,然后再恢复: 

第7步:利用lsof找到那个被删文件并恢复
linux一切皆文件!就是无论是具体的文件数据、压缩文件、图片文件还是网络链接信息、或者是磁盘设备、进程信息等等等等,都可以在linux系统上,以文件形式访问!就是你都可以用ls、ll、cat、cd等命令看到它!
这个例子中,只要nginx程序还在运行中,就还保留着这个程序相关的文件的数据,我们就可以在一个特殊目录/proc下看到它,这个目录就是管理机器上所有进程信息的文件夹。这个目录下面的进程id号文件夹下面的fd文件夹里面就运行着该进程相关的文件句柄,只要进程没有中断,我们就能从pd里面获取文件句柄数据,重新恢复文件。 

(6)kill命令
kill命令会向操作系统内核发送一个信号(多是终止信号)和目标进程的PID,然后系统内核根据收到的信号类型,对指定进程进行相应的操作。
信号,signal,简单的说就是向进程发送的一个控制信号,一般用于杀死、停止进程。每个信号都用一个数字表示。

  • kill

语法:kill [信号] PID
直接kill命令,什么参数也不加,默认的就是15号信号,就是告诉程序,你可以结束了。就是正常结束进程。比如系统关机的时候发出此信号。
kill -9 是强制终止,是个危险信号,可能会导致程序出现不可预期的错误,遇见杀不死的进程,只能通过这个信号来结束。
kill -1 表示不关闭进程,重新加载其配置文件,如reload操作就是给系统发出1信号。
kill -2 表示中断,比如ctrl+c就发出的是此信号
kill -3 表示退出,通常是ctrl+\ 发出此信号 

 再看看怎么正常结束一个进程:

以nginx为例,修改nginx的配置文件,发送kill -1信号,实现配置文件重读,配置生效 

  • killall和pkill
    这两个命令都是,根据进程的名字批量杀死,容易误杀,所以不建议用。
    比如机器上有3个用户登录,分别打开了3个vim, pkill vim或者killall vim就把这三个程序都结束了,是不是有的用户就不乐意了。

5、后台运行
程序运行有2种:
前台运行:程序运行在当前的终端,所有的信息都输出到屏幕上,占用你的终端,你也无法继续使用这个终端。并且如果终端关闭,就会导致程序自动退出。
后台运行:程序运行不占用你的终端,程序在系统后台运行着,你的终端该干啥干啥,终端关了,后台程序也继续运行。

如何让一个程序在后台运行,前台该干嘛干嘛

(1)后台运行命令: &符号
就是命令结尾加上&符合,命令就可以在后台运行了
例子1:让ping baidu.com命令在后台运行,命令产生的日志重定向写入黑洞

我们给ping baidu.com这条命令后面加一个&符合,这条命令就会在后台运行了。但是不管是在前台运行还是在后台运行,ping baidu.com这条命令一开始运行,就会在屏幕上不断打印日志。所以即使它在后台运行,即使我的终端前台还可以该敲啥敲啥,但是屏幕上还是会有不停的日志打印出来。所以这里我们把日志写入黑洞中,屏幕就不会打印了。

(2) bg 把后台程序继续运行起来,和&一样的用法
(3)fg 将已经在后台运行的程序,放入前台运行

  • jobs命令:可以看到当前会话的后台任务列表
  • ctrl+z 把前台运行的程序暂停,并且放入后台,但在后台也是暂停的。是中断程序,程序进程还在,就是中断了、不执行了,并且放入后台保持中断状态,但进程还在。
  • ctrl+c 把当前程序强制终止并结束。就是强制结束程序,前后台都没有这个程序了,这个程序的进程也销毁了,程序结束。
  • ctrl+d 等同ctrl+c,但是不返回任何交互信息。ctrl+c后会返回^C,catrl+z会返回^Z,ctrl+d不返回任何信息。
  • kill xxx杀死的是正在运行中的正常进程,而且是正常结束程序。如果程序是中断状态就不能用kill xxx来结束程序,就得用kill -9 xxx强制结束程序。

例子2:执行前台命令ping baidu.com,把日志重定向到一个文件中,练习bg,fg

 

不管是&还是bg还是fg,就是不管程序是在前台运行还是在后台运行,只要当前的ssh会话一关闭,前台后台的进程就都会结束。
比如你要解压缩一个50G的文件tar -zxvf xxx,需要很长时间,然后你去干别的事情了,等你再看,终端异常关闭了(比如你的ssh会话设置3分钟没有人操作就自动断开、或者电脑的屏保功能导致会话断开等),那跑的tar程序就也自动关闭了,你的解压的文件也就没了。

所以我们尽量要程序运行在后台,并且即使ssh会话关闭了,程序仍在后台跑不会中断,此时就要用nohup命令。

(4)nohup命令
nohup, no hang up, 不挂起,用于在系统后台不挂断的运行命令,退出终端也不会影响程序的运行,除非服务器关机。
这个命令经常和后台符&一起结合使用,实现程序后台运行且不中断!
这个命令,在默认情况下(没有重定向时),会输出一个名叫nohup.out的文件到当前目录下。
如果当前目录的nohup.out文件不可写,输出重定向到$home/nohup.out文件中

(5)小结
在服务器没有关机,正常运行的时候:
情况1:正常的网络断开,就是用户正常注销登录,比如用户敲了logout命令、exit命令等,用户正常的注销登录了。
情况2:异常的网络断开,比如异常的网络问题导致ssh断开、比如xshell突然崩溃导致ssh断开等情况
那么,在情况1下:

  • 命令+& ,你再ssh链接上服务器,你的命令仍然在后台安全可靠的跑着,只是你命令对应的进程变成了孤儿进程,它被1号进程收养了,但是这个进程依然正常跑着。
  • nohup+命令+& ,你再ssh链接上服务器后,你的命令也是依然在后台安全可靠的运行着,只是也变成孤儿进程了,也被1号进程收养了。
    在情况2下:
  • 命令+& ,再ssh链接上服务器后,你的命令进程就丢失了
  • nohup+命令+& ,你再ssh链接上服务器后,你的命令也是依然在后台安全可靠的运行着,但也是边孤儿被收养。

小结:&符只是帮助,进程在当前的ssh会话中,在后台运行。如果当前ssh会话异常断开,进程依然会消失。
nohup命令是,即使当前ssh会话异常断开,进程也不会丢失。并且nohup还给命令标准输出做了重定向。nohup命令一般和&一起使用,使进程既在后台运行还ssh异常中断进程也不结束。

6、理解linux的数据流
执行linux命令时,linux默认为用户进程提供了3种数据流:
stdin,标准输入,代号0,这个输入可以是键盘输入也可以是指定文件的数据输入,比如cat命令等待的标准输入
stdout,标准输出,代号1, 程序正确执行后的正确结果的输出,并且是默认输出到终端。
stderr,标准错误输出。代号2。程序错误,执行程序后报错信息输出到终端。比如当你写一个脚本,里面有一行代码有错,程序执行到这行代码时就会报错,程序就卡住了,整个脚本就无法执行。所以我们要对这些输出进行处理。

 7、数据重定向
上面的数据输入、输出都是直接显示在屏幕上,如果你想保留输入的信息、或者是保留输出的结果,由于在屏幕上,屏幕翻页就很难找了,此时数据重定向就可以把输入、输出定向到一个文件中,我们就等同于把输入、输出数据保存到文件中了,就可以随时查看。
(1)输入重定向

当在某个命令下,我们要输入的是一堆信息,此时一点点从屏幕上敲键盘输入就非常麻烦,最好就是我们先把要输入的信息写成一个文件,然后把文件输入,是最可靠高效的操作,此时就需要输入重定向符号<了。

(2)输出重定向
输出重定向是指把命令(或者可执行程序)的标准输出或标准错误输出重新定向到指定文件中。这样,该命令(或文件、脚本、程序)的标准输出和标准错误输出就不会显示在屏幕上了,而是写入一个指定的文件中。这样我们就可以随时查看并分析结果了,同时程序在执行的过程中也不会由于要打印输出结果而卡住。

  • 使用 > 符号,将标准输出重定向到指定的文件中,是覆盖写入。形式为:命令 > 文件名
  • 使用 >> 符号,把标准输出结果追加到指定文件后面,是追加写入。形式为:命令 >> 文件名
  • 使用 2> 符号,将标准错误输出重定向到指定文件中,也是覆盖写入。形式为:命令 2> 文件名
  • 使用 2>> 符号,将标准错误输出追加到指定文件的末尾,追加写入。形式为:命令 2>> 文件名
  • 使用 2>&1 符号或者 &> 符号(这个符号不常用),把标准错误输出stderr重定向到标准输出stdout。这样处理就不会报错了!就会实现程序的正确日志和错误日志都统一写入到一个文件中,防止程序出错的日志打印在终端上。
  • 使用 >/dev/null 符号,将命令执行结果重定向到空设备中,也就是不显示任何信息。
    总结:就是数据流1可以省,但2不能省。

说明:一些成熟的软件在开发过程中,都会在代码中进行异常处理。就是会捕捉代码运行时可能会出现的故障,将故障写入到一个文件中。同时,正确的输出也会写入一个文件中。

8、机器整体负载查看
系统负载指在单位时间内,操作系统分配给cpu处理的进程数量。数量越多负载越高,机器压力越大。

(1)负载查看
前面已经讲了用top,glance等命令查看,这里用uptime命令

 当这个3个值差不多,标识系统在稳定的运行中。
如果1分钟的值远大于15分钟的值,表示机器当前压力在直线上升。
如果1分钟的值小于15分钟的值,表示机器负载在下降中。

cpu最理想化的状态是,cpu每核都在运行着进程,就是让cpu充分工作起来。现在经常说的高并发编程,就是说如何让你的cpu各核同时工作起来。就是说,假如你的cpu有4核,而你的代码只让cpu的1核干活,那你的代码效率必然是不高的。

lscpu这个命令其实就是去读取/proc/cpuinfo这个文件,我们知道/proc目录里可以看到你机器的所有硬件信息,所以我们也可以直接cat /proc/cpuinfo 

(2)cpu压力测试
cpu的压力来自高频的计算任务。我们可以写bash程序、pyhon程序,以及各种编程语言写个程序来计算一下我们cpu的压力。但是我们也有很多成熟的工具直接使用。下面的几种工具,其实也是使用某一种编程语言写好了的一个二进制命令,我们现在直接使用这个命令即可。

  • 几个工具:
    stress 是一个linux的压力测试工具,专门用于对设备的cpu、io、内存、负载、磁盘等进行压测。
    mpstat 多核cpu性能分析
    pidstat 实时查看cpu、内存、io等指标。
    sysstat工具包:sysstat是一个软件包,包含监测系统性能及效率的一组工具,这些工具对收集系统性能数据,比如,cpu使用率、硬盘和网络吞吐数据,有利于判断系统是否正常运行,是提高系统运行效率、安全运行服务器的得力助手。

说明:解释性语言就是我们可以通过文本性的代码去操作,必然用shell语言、python或golang等编程语言把代码写好后,然后编译,生成二进制命令,我们就可以直接使用这个二进制命令了。

top是显示动态的负载情况,而uptime、free-m等都是某个时间点的系统状态。

以上都是cpu资源相关的,下面讲内存资源。

(三)内存资源管理
  • free命令
    top可以理解为资源管理器,如果专门看内存,可以用free命令,用于查看内存和swap分区的使用情况。

 total:是指物理内存的总大小,信息来自于/proc/meminfo,就是从/proc/meminfo文件中读取的数据
used:已经使用的内存=total-free-buff-cache
free:指空闲的内存=total-used-buff-cache
shared:指共享的内存,用于tmpfs系统,不用管,是系统内置的。
buff/cache:
  buff是写入缓冲区,用于内存和磁盘之间的数据写入缓冲,存放内存需要写入磁盘的的数据。当存够一定量的数据后(比如512mb),再一次性写入硬盘,这样可以避免逐个文件的不断写入产生的大量碎片文件和碎片数据、以及反复的寻道浪费时间,目的是加速写入数据,也降低磁盘的负荷。
  cache是读取缓冲区,是存放内存已经从磁盘中读取完毕的数据,就是提前将程序加载到内存再运行,就不会出现边运行边加载,cpu一直处于等待状态,目的是加快cpu和内存的数据交换,是加速读取数据的。

虽然cpu本身也是支持缓存的,而且cpu内部也有缓存寄存器,但是cpu内部缓存成本太高、缓存容量太小;虽然磁盘内部也是有缓存区的,但磁盘速度还是慢。所以linux内存也设计了这种的缓存技术。

swap行数据是swap交换分区,也就是我们通常说的虚拟内存(硬件交换分区)。防止内存用完导致系统崩溃,临时拿硬盘的一些空间当作内存使用。比如我们跑一个程序,这个程序很大,内存不够用,我们就开启swap功能,就会临时从磁盘中拿一些空间当内存使用。虽然听起来很美,但实际上效率很低、性能很差,一般不这样用。

(四)磁盘资源管理

1、df命令
查看磁盘空间,dist free
-h参数:表示可读性较高的形式展示大小

 size:总大小,总容量
used:已经使用的容量
avail:剩余可用容量
use%:使用百分比
mounted on:挂载路径,相当于windows的磁盘符,访问挂载点即可访问到该设备的数据。

2、磁盘io监控 iotop
iotop命令是一个用来监视磁盘I/O使用状况的类top工具。需要安装:yum install iotop -y

(五)网络资源管理

如果没有网络,两台机器之间传输数据就需要网线来连接,才能进行数据传输。现在有了网络、有了wifi、蓝牙,数据传递就可以通过网络进行无线传输了。

1、理解协议的概念

计算机网络就是一堆协议组成起来的。比如:ip地址的协议、上网的VPN拨号协议PPPoE、域名解析协议DNS、基础网络协议TCP/UDP协议等、文件传输协议FTP、网站HTTP协议。。。

通俗的理解协议,就是两台机器之间要进行通信,按照你通信的不同内容(比如你是要传输一个文件、还是你要访问一个网站、还是你要做VPN的拨号连接,这都是不同的通信内容)就对应不同的应用,不同的应用对应不同的工具,不同的工具对应不同的协议。基本上就是一款工具对应一款协议。所以互联网就是一堆协议,因为你的通信需求不同,就是你的通信内容不同,你就需要不同的通信工具,就对应不同的通信协议。

两台机器之间的通信除了文件传输外,还有其他很多需求,比如:
域名解析服务就走的是DNS协议。
www网络服务遵循http协议。
ping命令的ICMP协议。就是你执行ping命令,其实底层就是遵循ICMP协议去和另外一台机器进行通信,看另外一台机器是否还存活着的。
VPN的特殊协议。就是你搭建VPN的时候要遵循底层的隧道协议。
时间同步的ntp协议。就是你搭建的ntp服务,去同步时间,就走ntp协议。
两台远程机器之间的相互登录就走的是ssh协议。
等等等等。

2、通信的流程
全世界找不出任何一个人能彻底搞懂网络传输的过程,因为其中涉及了太多的路由器和交换机,进行了太复杂的数据交换,所以我们不需要关系数据是怎么走的,我们只要关心能否正常通信即可。

 

3、ip、端口、服务
由于网络资源管理涉及到的东西极多,我们这里是学习linux操作的,所以这里只讲如何管理机器的端口资源。

  • 机器ip地址:IP地址就对应了TCP/IP协议层,有一个ip地址号。我们查询的命令有:ifconfig命令、ip addr show命令、ip a命令
  • 服务器做域名解析(DNS服务):就是你机器的ip和你的域名之间做了解析服务。
  • linux服务器的端口,就对应了应用层,如80端口。查看的命令有:netstat命令、ss命令

一个ip+端口 就定位到了一个服务,80端口默认的是http协议的服务,如nginx这样的网站服务软件。

  • 以nginx为例,查看某个程序是否运行在了某个端口:
    由于nginx是一个网站程序,这个程序是Browser/Server模式运行的,所以:
    从服务端看,nginx跑起来必然要打开下面2个东西:
    一是,必然产生一个进程-进程号-进程信息,用ps-ef |grep 进程名 去查询程序的进程是否产生
    二是,程序必然会部署在机器的一个端口进行运行,nginx默认是80端口,我们可以用netstat -tunlp|grep nginx 或者 netstat -tunlp|grep 80命令去查询端口是否打开并监听中
    从客户端验证nginx是否启动: 用浏览器访问该网站的域名,看是否能访问,正常访问就是nginx程序正常。

4、网络协议之TCP、UDP
我们在敲netstat命令的时候,会经常见到tcp、udp的字样,其实这两个协议我们在讲ntp的时候有说过,可以去查阅一下,这里再讲一遍。
TCP:主要用在网站的通信。比如你要登录淘宝网,那淘宝网要保留你的信息,比如你的ip信息,就是要知道是谁登录了。此时你和淘宝网之间就有了一个长链接,就是你和淘宝网是要互相身份确认的,是要建立一个可靠的链接的。那怎么可靠呢,就是用TCP协议,因为这个协议规定通信双方都要确认身份,就是传说中的几次握手,只有身份确认无误后才能发送和接受数据。

UDP:是不用确认身份就发送和接受数据的。比如udp ddos攻击就是一个黑客疯狂的发出udp类型的请求,让对方机器大量的接受到很多无用的流量,导致对方网卡瘫痪,网络带宽占满,机器故障。

所以,tcp虽可靠但较慢,udp虽不可靠但速度快。优缺点是看场景的,比如网络视频播放,我就不是追求可靠而是追求速度的,所以视频播放就用udp传输最好。

小结:

  • (1)你机器得有网卡,得插网线,没有网线也得有wifi\蓝牙等无线,这个是物理层的
  • (2)你机器上得有网络适配器,能拿到ip地址
  •  
  • (3)计算机之间就可以基于Ip地址进行数据交换了。
  • (4)数据交换的时候你可以基于tcp协议也可以基于udp协议,看你的需求了,这里就是应用层协议了,需求是丰富的,所以这里的协议也是丰富,丰富的应用层协议。

5、netstat 查看网络连接状态

 -t 表示只列出tcp协议的链接;
-u 表示查看udp链接
-n 表示将地址从字面组合转化成ip地址,将协议转化为端口号来显示
-l 表示过滤出state列中其值为LISTEN的连接。监听中就是你的端口在运行中,等待客户来访问。
-p 表示显示发起连接的进程pid和进程名称。就是显示使用该端口的进程的id号

6、ss命令
ss和netstat命令功能一样。但是在高并发场景下,就是服务器的链接数特别多的情况下,ss性能比netstat更高一些。 

7、iftop命令 网络流量监控命令
作用和top和iotop一样,动态显示机器上网卡的流量动态。需要安装:yum install iftop -y 

进程、线程、协程 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值