Linux操作系统中的进程查看与进程调度
一.进程查看
什么是进程?
进程 process
计算机执行任务的最小单位,在计算机上运行一个应用软件可能会产生多个进程,
二.进程查看——ps -aux
ps命令查看进程
如上图所示,是ps命令加上aux选项产生的结果,其作用是查看机器中所有用户所有终端产生的所有进程信息。
a:all。u:user。x:所有终端
如上图所示,最后的COMMAND显示的是这个进程由哪条命令产生的,或者说是由哪个应用程序产生的。
START显示的是这个进程是什么时间启动的。
TIME显示的是这个进程在运行过程当中消耗了多少CPU的处理时间,
USER显示的是用户名,显示的是这个进程是由哪个用户启动的。
进程A对文件的权限是由启动进程的用户对文件的权限决定的。
PID指的是进程的ID,同一条命令在运行多次,每一次的PID都是不同的。
如上图所示,centos7以及centos7以上的系统所启动的第一个进程永远都是systemd,这个进程的PID是固定的,永远是1.
%CPU表示的是这个进程消耗了多少百分比的CPU资源,
%MEM表示的是这个进程消耗了多少百分比的内存。
熟悉以上知识的意义:当有一天机器运行速度特别慢,怀疑是不是有什么恶意的进程大量消耗了CPU和内存,使用ps命令进行查看当前机器运行的进程,如果是恶意攻击就将它干掉,如果是正常的进程再具体分析,是什么原因导致的。
RSS:常驻内存集,进程所占用的物理内存大小。
VSZ:虚拟内存集,进程所占用的所有内存大小(物理内存,共享内存,swap)
进程与进程之间存在通信的可能,进程间通信简称IPC
如上图所示,这就是两个进程之间的通信,
如上图所示,在计算机中绝对不允许一个进程跑到另一个进程的物理内存中读取数据,这会导致数据的安全性被严重破坏。
进程间通信:IPC
1)利用共享内存
2)消息队列服务器
如上图所示,在计算机中会有专门的一部分共享内存,是用来留给进程间通信使用的。
如上图所示,留给进程间通信的共享内存为121MB
如上图所示,在实际的生产生活中会专门有一个服务器安装消息队列软件,充当消息队列服务器的角色,其内存空间就是留给进程间通信使用。
消息队列软件:zeroMQ,RabbitMQ,Redis
VSZ包括物理内存,共享内存(内存空间可以共用),swap
TTY显示的是这个进程是在哪个终端上启动的。
STAT显示的是这个进程的运行状态,一个字母代表一个状态,
那么进程为什么要有状态之分呢?
因为CPU按时间切片来回切换进程来运行。给每一个进程专门的一个时间切片,当时间切片结束以后,踢掉这个进程换另一个进程来,当这个进程的时间切片结束后,再踢掉这个进程换另外一个进程来,在此期间不管进程是否执行完,只要分给这个进程的时间切片结束就换另外的进程来执行。
因为有按照时间切片进行的进程更换所以才有进程的状态之分。
多用户多任务的操作系统
产生一个任务就会产生一个进程,
单核CPU同一时间切片只能运行一个任务。
按时间切片,去执行多个任务,
如上图所示,CPU每秒能处理2.5G次数据。CPU处理数据的速度是2.5GHz每秒,也就是说该CPU每秒能处理2.5G次的数据。
进程状态介绍
R进程
R进程正在运行,比方说机器有4核CPU,那么cpu最多只能同时执行4个进程。
如上图所示,lscpu命令是查看CPU的型号,CPU的个数也可以查得到,
如上图所示,虚拟机CPU处理器的数量不能超过主机所支持的数量。
Z 僵尸进程
如上图所示,进程A是某一个进程的子进程,当这个进程A结束时,其父进程应该收回进程A所占的内存空间,但是此时恰好其父进程也出现了问题,进程A所占用的内存空间没有被收回。此时这个进程A就会处于一种僵尸状态,
如上图所示,可以使用pstree命令来查看进程之间的父子关系。所有进程的父进程是systemd
如上图所示,当使用kill -19进程ID来挂起进程14564的父进程的时候,发现其子进程处于Z的僵尸状态。
如上图所示,可以使用kill -18 进程ID 来恢复问题子进程的父进程,此时发现原来的处于僵尸状态的子进程被销毁了,新的子进程与之前处于僵尸状态的子进程的进程ID不同。
如上图所示,当系统出现僵尸进程的时候,可能是该子进程的父进程出现了问题,可以尝试使用kill -18 进程ID 来恢复父进程的运行。
不是每个进程都能操作硬件,在机器中唯一能够操作硬件的就只有内核,系统由内核和应用程序组成。
D进程和S进程
不可中断睡眠,代表在内核把数据返回给进程A之前,进程A就只能等着。
可中断睡眠,代表在内核把数据返回给进程A之前,进程A可以去干别的事情。
可中断睡眠比不可中断睡眠状态效率高。
高优先级指的是这个进程会优先被CPU调用执行,且被分配较长的执行时间。
+在前台运行的进程指的是在一个终端里面,这条命令会占着命令提示符,在这个进程结束之前干不了任何其他的事情。
T进程和Z进程
T和Z是进程的错误运行状态。
三.进程查看——ps -elf
如上图所示,PID是进程的ID,PPID是进程的父进程ID。
四.查看进程树,查看进程ID
如上图所示,查看进程树可以使用命令pstree,查看进程ID可以使用命令pidof
五.查看服务器的运行状态-top或者安装htop软件
1.动态查看进程
共享内存加上虚拟内存就是我们使用ps -aux命令看到的VSZ虚拟内存集,进程所占用的所有内存大小(物理内存,共享内存,swap)
RES是实际内存大小。
如上图所示,在top中敲M选项,可以使得所有的进程都是按照内存的占比排序显示,倒序最大的内存进程在上面,往下依次减小。
如上图所示,在top中敲P选项,可以使得所有的进程都是按照CPU所占的百分比进行倒序排序,
小写q退出top命令
如上图所示,开机时间,机器当前登录的用户数,机器CPU的平均负载,这三个数分别表示机器CPU平均1分钟的负载值,机器CPU平均5分钟的负载值,机器CPU平均15分钟的负载值。
将来通过这三个数值来查看机器CPU的使用是否是超量了。
一般情况下只要这三个数的平均数只要不长期超过CPU的核心数一般都叫正常。
如上图所示,可以使用命令lscpu来查看当前机器的CPU型号,
如上图所示,想查看机器的开机时间,登陆用户数,机器CPU在一分钟,五分钟,十五分钟的平均负载的时候,可以使用uptime命令直接查看。
如上图所示,在机器上使用top命令调出的第二行信息,是查看当前机器的进程状态,一共有135个进程,1个正在运行,134个睡眠状态,0个停止,0个僵尸。
如上图所示,这行信息是显示的是机器当前的CPU使用率,us表示的是user,表示的是机器中用户启动的进程所占用的百分比。
sy是system表示的是系统自己启动的进程所占用的百分比。
一般情况下,一个公司正常盈利的话,us:sy=7:3
id表示的是idle空闲,这里表示的是当前机器的CPU空闲率
如上图所示,标识的CPU使用率是机器所有CPU的平均使用率
如上图所示,如果你想在这个top的命令界面,查看每个CPU的使用率可以使用数字1.
如上图所示,Mem是机器的内存的使用情况,默认单位是KB,首先显示的是999720total是机器的内存总大小,内存的空余是多少,内存被使用了多少,最后的信息标识的是内存中有多大的容量被分配给了buff(缓冲)和cache(缓存)
在计算机中什么时候会用buffer什么时候会用cache?
计算机中基本的三大部件CPU,内存,硬盘,
CPU处理数据,硬盘保存数据,计算机中处理数据的速度CPU最快,硬盘处理数据最慢,内存处理数据的速度是居中的。
因为CPU处理数据的速度远大于硬盘处理数据的速度。所以无论是往硬盘中存数据也好还是往硬盘中读取数据也好,CPU不会直接与硬盘交互,
内存存在的意义就是为了缓解CPU和硬盘在处理数据的时候产生的速度差的。CPU先把数据交给内存再把数据存入硬盘中。反之也一样。CPU与硬盘之间的交互都要经过内存。
而Buffer和Cache就是用来给CPU缓存数据用的。
当CPU处理完一批数据这个数据要存入硬盘这个数据会先给BUffer,然后过一段时间以后才会将数据存入硬盘。
也就是说只有当CPU往硬盘中写数据,存数据的时候才会用到Buffer
用U盘拷一个特别大的文件的时候,进度条走完了,代表这个文件被CPU存入了内存里面,不代表这个数据被存入到了硬盘里面。
当CPU想要从硬盘中读取数据的时候,硬盘会先把数据传给Cache,然后才会把数据传给CPU。
机器中一共有32G内存,然后Buffer和Cache共分配20G内存,这属于正常情况。
而Buffer和Cache的大小是可以调节的。
而当Buffer和Cache的大小越来越大的时候,CPU与硬盘的交互的操作减少,机器的运行速度大大提高。
当机器在做读操作的时候,速度慢,可以选择将Cache的大小调大。
一台计算机完全可以只有CPU和内存,没有硬盘,
在机器的整体内存中如果Buffer和Cache的容量占比越大,机器整体的性能提升的越多。
如上图所示,机器的内存有16GB,buff/cache共占内存12GB,在Linux操作系统中可以使用free -h命令来查看当前机器的内存使用情况。
如上图所示,是swap交换分区的使用情况。
如果交换分区的使用率越来越大,机器的运行速度会大幅下降。
在top中数字1显示每个CPU的使用率
2.查看CPU的型号
如上图所示,查看CPU的使用率mpstat 1 5 表示的意思是每一秒显示一次CPU的使用率,一共显示5次。
3.内存
查看内存的容量使用情况,free -m
-m选项上面所有的数据单位全部都是MB
如上图所示,7mb作为共享内存是足够的,因为总内存才有900多MB
查看内存的IO(读写效率)
vmstat 1 5
如上图所示。vmstat 1 5命令动态显示内存的读写效率,表示的意思是每秒显示一次,一共显示5次。
4.硬盘
1.查看硬盘容量使用情况使用命令df -hT
2.查看硬盘的IO,即查看硬盘的读写效率就使用iostat 1 命令,
如上图所示,使用iostat命令可以查看到我机器上所有的块设备文件。
如上图所示,使用lvscan查看到的是机器上的两个逻辑卷实际上是两个软链接。
如上图所示,dm -0和dm -1才是机器上真正的块设备文件。
5.网卡(查看网卡流量)
1.查看网卡IO,网卡每秒能往外发送多少数据,网卡每秒能接收多少数据。
如上图所示,rx表示每秒能接收多少数据,tx表示每秒能发送多少数据,单位都是数据包。
2.查看网卡的速率
如上图所示,使用命令ethtool ens33去查看网卡的速率。
四.进程调度
一.通过信号影响进程的运行方式,
查看Linux操作系统系统支持信号,使用命令kill -l
向进程发送信号
kill 信号 PID,,,当使用这个命令的时候,信号不写,默认就是15
杀死进程的两种方式
15:正常结束进程
9:强制杀死进程
如上图所示,我可以在机器上开两个终端,在其中一个终端上使用vim编辑器开启一个文件,但是不关闭。
此时在另一个终端里使用命令ps -elf | grep vim去查看机器此时关于vim的进程,
看到vim /etc/fstab这个进程的PID是1485,此时使用kill -15 PID命令去正常结束进程,此时回到另一个终端下会发现vim Finished的标识。
当使用kill命令默认不加信号的时候,默认信号是15,即正常结束进程,
如上图所示,系统提示vim编辑器捕获到一个信号信号名叫TERM,此时显示vim编辑器Finished。
如上图所示,此时终端上的vim编辑器进程被强制kill了。
如上图所示,当同样开启两个终端时,其中一个终端敲vim /etc/fstab这条命令,另一个终端敲kill -9 PID,强制结束vim编辑器的进程,此时在原来的使用vim编辑器的终端再次打开文件/etc/fstab/的时候,会发现如上图所示,swap临时文件已经存在,这和vim的工作流程有关,
如上图所示,这是演示的是vim编辑器的工作流程,首先使用vim 编辑器打开文件/data/file01
此时系统同时生成一个文件/data/.file01.swap,vim编辑器打开的文件其实是/data/file01,但是修改的文件/data/.file01.swap,而当这个文件保存退出的时候,系统会自动用这个/data/.file01.swap把源文件覆盖掉,然后这个临时文件会被删除。
当使用kill -9 PID的时候,这个进程虽然是强制退出了,但是这个临时文件没有被销毁掉。所以会有提示,/data/.file01.swap这个临时文件已经存在。这属于非正常退出vim编辑器。
这就是vim进程被强制结束,vim进程产生的临时文件还在。
如上图所示,可以使用rm -rf命令把这个临时文件删除,这时再使用vim /etc/fstab文件就会发现正常了。
如果使用kill -9 PID杀死的是正在提供服务的程序,可能会造成服务产生数据丢失。
如果vim进程非正常退出,或者vim进程没有关闭,那么vim进程产生的临时文件,就不会被销毁。
挂起进程
19:表示的是暂停运行一个进程
18:表示的是继续运行一个进程
使进程重新加载配置文件
kill -1 PID不重启进程,只是使得进程重新加载一下配置文件。这样操作也会使得我的修改生效。
nginx启动的时候,会在机器上启动一个80的端口号,
现在要对nginx的启动端口进行修改,
这是这个nginx软件的配置文件,nginx.conf
这行配置就是用来指定nginx的端口的,修改端口号为8080
如上图所示,是重启nginx软件使得修改配置文件生效的过程。
如上图所示,是使得进程重新加载配置文件,使得修改配置文件的操作生效的过程。
systemctl命令只能控制系统服务,也就是通过rpm安装包安装的服务,
信号是用来向进程发送的,而source 命令的本质就是让系统把文件中的所有命令重新再执行一遍,让修改生效。source是控制系统全局的而不是某一个进程,信号是用来控制某一个进程的运行方式,
killall命令同时结束多个同名的进程。
在系统中除了kill命令还有killall命令,而killall可以杀死多个同名的进程。
如上图所示,可以使用kill 信号 PID ,killall 信号 进程名称,可以使用killall命令可以同时对多个同名的进程发送信号。这里的信号默认是15,正常结束进程,
二.控制进程在前后台运行
进程在前台运行指的是在同一个终端里面,这个命令占着命令提示符,在这个命令结束之前是不能干其他的事情的。
控制进程在前台运行主要适用于长时间执行的命令。
如果你想在这条命令执行的同时在这个终端上做些其他的工作,可以先把这个命令仍到后台运行,
vim编辑器就是默认在前台运行的进程,Ctrl +z可以把这个进程扔到后台,此时命令提示符就可以干别的事情了。
Ctrl +z把当前命令放到后台暂停运行,(正在运行的任务)
如上图所示,可以使用命令jobs -l命令来查看当前机器后台有哪些进程。以及进程在后台的状态,
如果想把某个进程调到前台运行可以使用fg 加上任务编号,
如上图所示,使用Ctrl +z将进程暂停,使用jobs -l命令可以查看到后台有一个暂停的进程,想要结束后台暂停的进程只能用kill -9 PID,可以看到这个后台暂停的进程被杀死了。
如上图所示,可以使用&符号将进程放到后台运行,
如上图所示,如果机器根分区提示使用率满了,无论敲什么命令系统都会提示输入输出错误。这时只能进入救援模式。去处理根分区的问题。
如上图所示,将进程放到后台运行有两种方式第一种方式是在进程后面加上一个&的符号,第二种方式是在进程前加上nohup在进程的结尾加上符号&
为什么推荐使用第二种方式呢?
原因在于第一种将进程放到后台运行的方式,当终端结束的时候,这个在系统后台运行的进程也就结束了,如果此时这个在后台运行的进程正在进行一些数据的操作,那么这很可能会导致这些数据的丢失,而第二种将进程调到后台运行的方式不会因为面前这个终端的结束而结束后台正在运行的进程。
五.计划任务
计划任务的类型:
1.一次性任务
2.周期性的计划任务
1.一次性任务
前提:依赖于atd服务正常运行状态
确认在centos7上确认某一个服务的状态可以使用,systemstl status atd
这个atd服务的状态良好
如上图所示,可以先使用date 来查看机器的时间,然后使用at 规定的时间点,然后敲回车,在规定的时间点执行什么任务,写完以后敲Ctrl + d退出,当时间到了,去查看一次性任务是否执行成功。
2.周期性计划任务,前提:依赖于crond服务正常运行
注意的点:计划任务执行操作时,如果该操作会产生信息,默认计划任务会将信息作为邮件发送给当前用户。同时这个邮件会被存入到系统硬盘上占用系统硬盘的空间。
注意:计划任务默认认为%为命令的结束符,如果命令中存在%,需要进行转义。
创建计划任务
crontab -e为当前用户设置计划任务,
为不同的用户设置计划任务主要影响就是权限的区别,
crontab -e执行的效果就相当于是打开一个空文件一样,然后在这个空文件中写计划任务,一行一个,
每一行具体格式分为两部分,一部分是时间,一部分是操作(命令)。
时间需要注意的格式
分(0-59),时(0-23),日(1-31),月(1-12),周(1-7或者是0-6)
30 20 * * *这个表示的就是每天晚上8点半
0 10 * * 5 每周五上午十点,
0 8-10 * * 3 每周三上午八点到十点
30 10,13,17 * * *通过逗号可以表示不连续的时间,
在操作系统上进行操作的时候应该使用英文。
*/30 * * * * 现在我想让机器每隔半个小时执行一遍操作,
30 * * * *每间隔一个小时执行一遍操作
0 10-22/2 * * * 从上午十点到晚上十点,每隔两个小时执行一次操作
命令需要注意的格式
1.建议所有的命令以绝对路径的方式去写,
2.在同一时间点只能操作一条命令,当有多条命令需要去执行的时候,需要把命令内容编写到shell脚本中。去执行shell脚本。
有人写计划任务,简写命令,会出现这条命令执行不了,当把命令都写成绝对路径就好用了。
原因:周期性计划任务中有一个独立于系统PATH变量的PATH变量,
如上图所示,
2.在同一时间点只能操作一条命令,
在进行周期性计划操作的时候,要求会编写shell脚本,将多个操作编写成一个shell脚本,然后在周期性计划任务里面去执行这个shell脚本。
计划任务实例:
案例:每隔2分钟同步时间
注意:计划任务执行操作时,如果该操作会产生信息,默认计划任务会将信息作为邮件发送给当前用户。同时这个邮件会被存入到系统硬盘上占用系统硬盘的空间。
如上图所示,在计划任务当中可以在命令的结尾利用重定向功能将计划任务产生的邮件发送到/dev/null这个黑洞目录里面。
如上图所示,可以使用utpdate 时间服务器地址,来校对机器的时间信息。
如上图所示,这个网址提供着一些时间服务器地址。
如上图所示,此时我将机器的时间修改错乱。
如上图所示,此时我将机器的时间与时间服务器进行校对。
如上图所示,这时我在周期性计划任务中编写的任务,即每两分钟同步一次时间,
如上图所示,可以使用crontab -l命令来查看周期性计划任务中所编写的内容。
案例:每间隔一分钟创建目录
注意:计划任务默认认为%为命令的结束符,如果命令中存在%,需要进行转义。
如上图所示,如果在编写计划任务的时候,系统会默认%是一个操作的一个结束符
如上图所示,这是将%进行转义的操作,
如果写的计划任务,会在屏幕上显示信息,这些信息,会被计划任务当成邮件发送给当前用户。
邮件的内容是保存在我机器的硬盘上的,时间长了,硬盘的空间会被占满。
如果这些邮件不想要可以写一个重定向,将这些邮件发送到一个黑洞文件中去,
如果这个将邮件发送到黑洞目录中去的效果放到计划任务中去,计划任务该执行还是执行只不过这个信息没有了而已。
案例:每隔两分钟,搜集系统的运行状态(CPU负载,磁盘使用情况,内存使用情况)
如上图所示,可以使用uptime命令查看当前机器的CPU负载。
如上图所示,可以使用df -hT命令来查看机器的硬盘使用情况。
如上图所示,可以使用free -m命令来查看机器的内存使用情况。
如上图所示,/usr/bin/bash是bash命令的绝对路径。/root/test.sh是这个shell脚本
如上图所示,如果要编写计划任务,实现以上操作,可以编写一个shell脚本直接将这三条命令编写到shell脚本中,然后运行这个shell脚本,就会发现如上的结果。
如上图所示,这个周期性计划所产生的结果会发送到用户的邮箱里。