本系列文章为尚硅谷武晟然老师的Linux入门教程学习笔记,前面的系列文章链接如下
Linux入门教程:P3->Linux文件系统
Linux入门教程:P4->Vim编辑器
Linux入门教程:P5->网络配置
Linux入门教程:P6->系统管理
Linux入门教程:P7->Shell介绍
Linux入门教程:P8->文件目录类
Linux入门教程:P9->时间日期类
Linux入门教程:P10->用户权限类
Linux入门教程:P11->文件查找类
Linux入门教程:P12->压缩解压类
Linux入门教程:P13->磁盘管理类
一、查看进程
1.1 基本用法
基本概念
进程是正在执行的一个程序或命令,每一个进程都是一个运行的实体,都有自己的地
址空间,并占用一定的系统资源。有些进程在内存中停留的时间会非常的短(如ls、cd这些命令),而有些进程(如网络服务)会一直常驻在内存里,这种进程叫做服务。
Linux系统中,进程可以分为两大类:
①前台显示的进程
②后台运行的进程。
系统服务往往都属于后台进程,具体执行这些系统服务的那个进程一般叫做守护进程。这些守护进程的命令都是以d.service结尾,他们都在/usr/lib/systemd/system
中。
然后ls /usr/lib/systemd/system | grep d.service
进行筛选,就可以看到许多守护进程了。
其中里面有一个sshd.service,我们用Xshell做远程连接的时候就使用了SSH服务连接到了我们的虚拟机上。sshd.service就是SSH服务的守护进程。
windows查看进程
ctrl + alt +del
打开任务管理器,这些进程分为了两类:应用和后台进程,我们就可以认为前台跑着的是用户进程,这些后台进程大部分就是系统服务。
Linux查看进程
ps:process status 进程状态
基本语法:
ps aux | grep xxx
(功能描述:查看系统中所有进程)
ps -ef | grep xxx
(功能描述:可以查看子父进程之间的关系)
选项说明:
a
:列出带有终端的所有用户的进程
x
:列出当前用户的所有进程,包括没有终端的进程
u
:面向用户友好的显示风格
-e
:列出所有进程
-u
:列出某个用户关联的所有进程
-f
:显示完整格式的进程列表
示例: 使用ps
显示进程,如下所示。
它只显示当前用户调用的进程、跟当前这个终端控制台相关联的所有进程,所以就很少了。
选项分类:
①加杠的风格就是标准unix风格。
②加杠的风格就是标BSD风格。Linux继承自Unix,而Unix的演变过程中有一个衍生的版本BSD,对后来的苹果系统都有影响。
BSD风格:
示例: 使用ps aux
显示相关进程信息
我们看到这里的进程非常多,可以做一个管道ps aux | more
进行翻页显示。
示例: 执行ps -ef | more
命令显示进程信息。
里面有个PPID,其实就是他的父进程的ID。
注意: 写这些命令需要注意,比如ps aux
不要写成ps -aux
,因为如果刚好有x
这个用户,则显示x
相关的进程。但是默认情况下,如果找不到X这个用户的话,Linux会自动把它理解成ps aux
。
1.2 进程信息详解
ps aux的信息
输入
ps aux | more
,显示进程的相关信息。
USER:该进程是由哪个用户产生的
PID:进程的ID号
%CPU:该进程占用CPU资源的百分比,占用越高,进程越耗费资源
%MEM:该进程占用物理内存的百分比,占用越高,进程越耗费资源
VSZ:该进程占用虚拟内存的大小,单位 KB
RSS:该进程占用实际物理内存的大小,单位 KB
TTY:该进程是在哪个终端中运行的。
----问号:表示它没有任何的终端
----tty1:图形化终端(早期的交互式终端就是一个类似于打字机的东西,所以叫tele type writer)
----tty2-tty6:本地的字符界面终端。前面我们按ctrl +alt +F1~F6进入的大黑屏就是这几个东西。
----pts/0-255:代表虚拟终端。不管是在当前的虚拟机里边直接打开一个终端,还是在X shell里面打开一个终端,其实产生的都是一个虚拟终端。
STAT:进程状态。
----R:运行状态
----S:睡眠状态。进程已经启起来了,但是现在没有进行处理,可能在等待某个事件或信号来唤醒它继续执行。
----T:暂停状态
----Z:僵尸状态。这个进程已经马上要结束了,但是它有一些信息还没有删除,父进程可能还需要它的一些信息,只剩下了一个空壳。正常情况下当它的父进程退出的时候就会把它彻底清掉。
----s:包含子进程
----l:多线程
----+:前台显示
----<:很高的优先级
----N:很低的优先级
START:该进程的启动时间
TIME:该进程占用 CPU 的运算时间
COMMAND:产生此进程的命令名
注:
①虚拟内存占用的更多,比物理内存占的还大。交换分区不是来扩充物理内存的吗?物理内存都没用完怎么就开始用虚拟内存了呢?
答:Linux对内存管理有一整套完整的机制。如果内存里边有一些页面不常用,并不是等把内存全占满了之后才把它替换到外边的虚拟内存中。而是只要判断当前内存有一些页面长时间都没有用到的话,就直接把它换到虚拟内存里面去了。经常使用的才保留在当前的物理内存里面,当前对内存的占用就会更少,就会更加的高效啊,就可以尽量的把物理内存空出来去处理更多的事情。
②第一个就是pid为1的一号进程,该进程执行/usr/lib/systemd/systemd
的命令。
二号进程专门负责所有内核线程的调度和管理的,始终运行在内核空间。所以后面可以看到很多系统级别的服务都是以系统线程的形式运行的
ps -ef的信息
运行
ps -ef
,信息如下。
主体都差不多,最大的区别就在于多了一个PPID和C。
PPID:父进程的PID。一号进程systemd和二号进程kthreadd的父进程是0号进程。0号进程比较特殊,是idle进程。因为一号进程是第一个启动的用户进程,所以启动他的就只能是系统级别的进程。
C:CPU 用于计算执行优先级的因子。数值越大,表明进程是 CPU 密集型运算,执行优先级会降低;数值越小,表明进程是 I/O 密集型运算,执行优先级会提高。
总结
如果想查看进程的 CPU 占用率和内存占用率,可以使用 aux;
如果想查看进程的父进程 ID 可以使用 -ef
1.3 查看远程登陆进程
远程登陆进程与ssh相关,使用
ps -ef | grep sshd
筛选和ssh相关的进程,搜索出了三条结果。
①第一条就是我们直接启动sshd服务的那条命令,对应的进程的PID是1130,它的父进程直接就是一号进程。我们使用systemctl status sshd
查看ssh服务的状态,可以看到是正在运行的状态,而且它是开机启动,即由一号进程直接启动。
②第二个就代表我们的XShell以root的身份打开了一个虚拟的终端去登陆到了我们远程的服务器上。它是通过sshd这个守护进程创建出来的一个子进程。
③最后还有一个grep --color=auto sshd,这是我们当前进行ps然后进行筛选sssh这条命令对应产生的一个。
新创建一个远程连接,以root用户身份登录
在XShell中新创建一个链接,以root登录
然后执行ps -ef | grep sshd
,可以看到多了个pts/1,这就是我们现在的远程连接。
新创建一个远程连接,以普通t用户身份登录
在XShell中新创建一个链接,以普通用户登录。
然后执行ps -ef | grep sshd
,可以看到多了两个sshd进程。
原因:atguigu@pts/1
很显然我们这里又打开了一个远程登陆的终端,用户是atguigu。上面有个atguigu [priv]
,用户是root。这主要是为了权限分离。一个进程单独列出来。它保留Root身份,我们在想要使用root权限去执行一些操作的时候就使用这个进程去进行操作。如果是普通的艾特硅谷用户去进行操作的话,就用下面的这个远程登录的进程去进行操作。这样的话权限分离,我们在安全性上、性能上都可以得到更好的保证。
二、终止进程
kill 终止进程
①
kill [选项] 进程号
(功能描述:通过进程号杀死进程)
②killall 进程名称
(功能描述:通过进程名称杀死进程,也支持通配符,这在系统因负载过大而变得很慢时很有用)
示例: 现在我们通过远程登录了两个root和一个atguigu用户
现在要终止掉atguigu用户。可以使用kill 3081,也可以使用kill 3085。现在再去看进程信息,可以发现atguigu进程就没了。
回到XShell也可以看到显示atguigu的链接被其他主机关闭掉。
示例: 还可以kill掉另外一个使用root登录的远程连接进程
回到XShell,可以看到链接断开。
示例: 还可以kill掉自己,Kill之后直接断开。
示例: 现在我们将这三个远程连接用户重新连接上,然后准备kill掉他们的守护进程1163
我们执行kill 1163,可以看到三个远程登陆的进程的父进程全部变为1了。
除此之外,我们无法再通过远程连接登录其他用户了。而且如果关闭这三个远程连接进程,他们就再也连接不上了。
解决方案: 查看下sshd服务的状态,可以看到是关闭状态
于是我们重新打开即可,可以看到处于运行状态。
现在我们将atguigu用户重新登陆,可以看到atguigu进程的父进程就是我们重新启动的sshd守护进程3740的子进程。
注: 我们这里一直有个代表当前sshd命令的进程grep -color=auto sshd
,我们来看看它的父进程是谁。通过ps -ef | grep 3862
可以看到它的父进程就是我们这个终端界面bash。现在sshd的调用关系就很明显了:1
->sshd
->远程连接
->bash
。
kill -9 强制终止进程
我们想要看到当前所有的bash
现在我们想要kill掉pts1的虚拟终端进程3402
,尝试后发现无法Kill。因为Shell控制台是正在运行的一个进程,如果直接kill是不行的。
解决方案:kill 9 进程
这个-9代表系统的信号值,代表杀死信号。
现在我们强制杀掉pts2的bash,可以看到成功杀掉。
killall sshd
killall需要小心使用,比如我们这里使用killall sshd
,可以看待所有窗口都断开连接了。连守护进程都关掉了,我们重连不上了,我们就只能去服务器将sshd开启。
三、查看进程树
pstree
①基本语法:
pstree [选项]
②选项说明:
-p
:显示进程的 PID
-u
:显示进程的所属用户
示例: 使用pstree
查看进程树,可以看到最初的进程就是systemd,然后由它延申出许多进程。
使用pstree -p
将pid显示出来。
使用pstree -p
将所属用户显示出来。
四、实时监控进程
top 实时监控系统
ps:更像一个快照,把当前正在活动的进程信息直接咔嚓一下拍下来,然后使用more或者less做分页展示,看看里面到底是什么东西。
top:实时的监控展示,他会给我们打开一个交互式的界面,然后实时地刷新当前的进程信息。
示例: 运行top
,信息如下所示,共两大部分。
①上面部分
第一行:top是当前程序的名称;显示当前的时间;一个up;系统启动运行之后到现在持续的时间;现在登陆了多少个用户(服务器端1个+XShell3个+服务器端图形化桌面环境进来的时候也是一个root用户);平均负载(这三个数代表过去的1分钟、5分钟和15分钟之内整个系统的平均负载。一般情况下这个平均负载小于0.7的话我们就认为这个负载不太大,如果大于1就说明超出了当前的系统负荷)
第二行:总共的任务(进程)数量。后面分别是各种状态的进程的数量。
第三行:对CPU的占用了。
----us
代表用户进程(默认没有更改优先级的用户进程)占用CPU的时间比;
----sy
代表系统进程占用当前CPU时间的百分比。
----ni
是nice
命令的前两个字母。nice命令可以给运行的进程指定友善值,友善值越高表示这个进程越友善,那么它的优先级就越低,他总会为别人让路。如果友善值越低,那它的优先级就越高,表示它特别的强势,优先去运行。所以这里指的就是经过nice命令调整当前的优先级之后的所有用户进程在CPU运行时间里边的占比;
----id
代表CPU空闲的时间;
----wa
是wait的前两个字母,显示当等待IO操作的时间占比。很多进程可能本身该干的活已经干完了,但是需要等待一个IO的输入输出的消息,那这个时候他就会等待,这个时间占了多少就显示在这里。
----hi
是hardware interrupt的简写,代表硬中断服务请求时间的占比;
----si
是softwareinterrupt的简写,代表软中断服务请求时间的占比;
----st
代表我们的机器被虚拟化设备占用的时间占比。
第四行:当前的内存占用的情况,单位是KB。
第五行:当前的虚拟内存占用情况,单位是KB。
②下面部分是关于整体系统运行的状态。
----PID代表进程的编号
----USER代表哪个用户正在调用该进程
----PR(priority)代表当前任务调度的优先级
----NI代表用户指定的nice值
----VIRT代表虚拟内存占用的大小
----RES代表实际内存占用的大小
----SHR代表共享内存占用的大小
----S代表当前进程的状态。当前大部分都是S(sleeping)
----%CPU代表当前进程CPU计算时间的占比
----%MEM代表当前进程内存的占比
----TIME+代表进程运行的时间(占用CPU的总时间)。这个加号指当前的精度是精确到秒后边的两个百分点,也就是精确到0.01秒。
----COMMAND代表生成当前进程的命令。
切换排序顺序:
①M
或者shift m
,按照占用内存从大到小排序。
②P
或者shift p
,按照占用CPU时间从大到小排序(默认这样排序)。
③N
或者shift n
,按照PID从大到小排序。
选项说明
-d 秒数
:指定 top 命令每隔几秒更新,默认是 3 秒。
-i
:使 top 不显示任何闲置或者僵死进程。
-p
:通过指定监控进程 ID 来仅仅监控某个进程。
示例: 使用top -p
命令来过滤掉闲置进程。闲置的标准是从上一次显示之后到目前这一次要显示的时候一直都没有再去占用CPU,也就是说这段时间没占用CPU就是闲置的就不显示。所以进程状态未必都是R,可能占用下CPU又sleep了,所以也可能是S。
示例: 在监控期间,按下小写u,然后输入用户名即可监控指定用户的进程。比如我们在XShell中登录atguigu,然后再来这里指定显示XShell的进程。
运行,可以看到atguigu相关的进程了。
示例: 在监控过程按k,然后输入PID可以kill掉指定进程。
然后需要输入信号名称或信号值
五、网络状态和端口监控
netstat
基本用法:
netstat -anp | grep 进程号 (功能描述:查看该进程网络信息)
netstat –nlp | grep 端口号 (功能描述:查看网络端口号占用情况)
选项说明:
-a
:显示所有正在监听(listen)和未监听的套接字(socket)
-n
:拒绝显示别名,能显示数字的全部转化成数字
-l
:仅列出在监听的服务状态
-p
:表示显示哪个进程在调用
示例: 使用命令netstat -anp | less
查看
Proto:使用套接字进行这个网络传输对应的网络协议,这里的tcp指的是IPV6下相关的一些协议。
Recv-Q:连接到当前这个socket的用户程序还没有拷贝的字节数,也就是代表已经接收到了但是还没有拷贝出来的字节数量。
Send-Q:已经发出去了但是远程的主机还没有确认收到的字节数,有可能是被丢掉需要重新传递的数据。
Local Address:当前的地址(socket的形式),即IP+冒号+端口号。
----0.0.0.0
:本机本地的所有地址
----127.0.0.1
:回环地址,一般用来做本地监听和测试
Foreign Address:远程地址
192.168.123.1是我们物理PC机的IP地址,这里我们有两个用户通过不同端口连接上了VM的22端口,状态就是ESTABLISHED。
六、系统定时任务
基本语法:
crontab [选项]
选项说明:
-e
:编辑 crontab 定时任务
-l
:查询 crontab 任务
-r
:删除当前用户所有的 crontab 任务
参数说明:
①进入 crontab 编辑界面。会打开 vim 编辑你的工作
②特殊符号
③特定时间执行命令
示例: 输入crontab -e
进入编辑页面,然后输入*/1 * * * * echo "hello, world" >> /root/hello
,代表每隔一分钟向hello文件中追加hello, world这句话。
然后隔一分钟去看hello文件,可以看到就有内容了。
我们还可以使用tail -f hello
查看hello文件的变化
也可以使用crontab -l
查看定时任务文件的内容
最后可以使用crontab -r
清除crontab任务