一、进程的相关概念
程序:以物理状态存储的实体的状态形式的文件!
进程:程序被触发后,系统会将执行者的权限和属性、程序的代码、以及与所需的数据都加载到内存中,专门开辟一块区域,
操作系统并给予这个内存内的单元一个标识符(PID),通俗的讲就是一个系统中为完成并且正在运行的程序!
说明1:程序何时被触发--->执行一个命令或程序!
说明2:触发指令的身份和执行命令的身份可能不匹配(特殊权限)!
说明3:此块区域的内存除了加载自身的数据外,要加载相应的依赖文件!
##########################################
二、查看进程的状态
1)通过资源管理器查看!
gnome-system-monitor
2)进程的5种状态
1. 运行(正在运行或在运行队列中等待)
2. 中断(休眠中, 受阻, 在等待某个条件的形成或接受到信号)-->可被唤醒的休眠状态
3. 不可中断(收到信号不唤醒和不可运行, 进程必须等待直到有中断发生)-->I/O阻塞
4. 僵死(进程已终止, 但进程描述符存在, 直到父进程调用wait4()系统调用后释放)
说明:程序已经终止,但无法移除进程至内存外-->httpd的例子!
5. 停止(进程收到SIGSTOP, SIGSTP, SIGTIN, SIGTOU信号后停止运行运行)
简单测试:
(1)bash终端命令行开启firefox
(2)资源管理器查看firefox进程的状态---->Running
(3)firefox最小化,此时用资源管理器查看进程的状态-->Sleeping(不占用cpu的资源)
(4)对(1)步骤的firefox执行【ctrl-z】此时用资源管理器查看进程的状态-->Stopped-->铅色(输入不了内容)
孤儿进程:httpd服务的案例
演示思路:
(1)首先安装该服务软件,然后开启服务
(2)查看此服务的进程:ps ax |grep http-->发现一个监护人和多个员工
(3)干掉监护人(主)进程,然后看系统中的http进程-->ps ax |grep http
(4)此时默认httpd服务关闭,"重新开启(restart)"发现开启不了,也删除不了!
(5)解决办法:killall -9 httpd -->根据服务的名字杀死子进程!
(6)重新开启,看其状态!
孤儿进程:受系统程序初始化程序控制
###############################################
三、命令行查看进程的状态
1)ps (常用)
a:显示终端上的所有进程(不一定是同一个终端),包含其他用户的进程,主要是通过"命令行开启"的进程!
x:显示没有终端控制的进程,主要是后台进程(与终端无关,主要是后台守护进程)!
用法:常常是ax结合使用
-a:与a相比少两个进程(与环境信息无关,终端颜色的进程和当前开启的bash进程)
u:按照用户的排列展示进程的用户信息!
f:进程的父子调用继承关系
常用组合:
aux -->显示系统中所有进程并显示进程的"用户信息"
ef -->显示进程中详细的信息并显示进程的父子关系
ax -->显示当前系统中的所有进程信息
defunct-->僵尸进程--->通过ps查看系统进程看是否有此关键字!
pstree:显示当前系统的进程树 -->systemd是顶级进程,早期用此来控制相应的服务!-->加上-p参数来显示对应的pid!
2)利用ps工具标识进程的5种状态码
D 不可中断 -->I/O阻塞的Sleeping--> ex >helloD-->终止影片的播放
R 运行 -->runnable 或者在队列中(quene)
S 中断 -->可以通过信号唤醒 sleeping
T 停止 -->ctrl-z在命令行的执行的命令-->暂时停止,画面还留在当前界面!
Z 僵死 -->zombie process -->进程关闭,占用的系统资源不释放
3)显示进程的指定信息及排序
常用:ps -o user,group,comm,pid,ppid,nice,%cpu,%mem
说明: o-->option;mem--->memory(内存);comm-->command(命令);nice(优先级)
进程排序(默认是正序排序)-->从小到大!
ps --sort=参数 -o 参数(默认是+表示正序)
ps --sort=-参数 -o 参数(倒序-->注意-的位置)!
需求:将进程中占用cpu最高(按从大到小顺序排列)的前5个用户的pid和cpu以及命令信息保存到temp.txt文件中!
说明:Xorg所对应的是图形界面!
注意细节:默认第一行是说明信息!
特殊:stat显示的信息
ps -o stat
############################
l --->内存中有锁定空间
N --->低优先级(相对于平均优先级)
S < --->高优先级(相对于平均优先级)
+ --->前台运行(命令行开启火狐、vim、gedit等)
s --->顶级进程(祖宗)
4)进程优先级的设置
方式1:renice -n number pid --->运行中的进程设置优先级(动态)!
方式2:nice -n number 程序命令 -->开启程序时指定优先级(静态)!
说明:优先级的范围是[-20,19],值越小优先级越高!
优先级:进程被内核先调度的机率!
####################################
三、bash下的工作管理
管理方式
**************方式0************
ctrl-z 将占用终端的进程打入到后台"等待"(暂停)-->firefox和gedit具体的表现为铅色无法输入!
场景(vim 但是不知道文件放在哪里,需要到bash环境,将vim丢到后台中"等待"-->不需要结束)
**************方式1*************
bg number 将进程从前台调度到后台自行"运行"-->background-->注意:自行运行的条件
**************方式2*************
fg number 将进程(任务)从后台调度到前台"运行"-->foreground-->出现提示符让你操作的环境!
**************方式3**************
comm(任务) & 将进程打入到"后台运行",当前终端仍然可以进行其它工作,完成之后,显示完成的信息(Done)!
注意:放入后台的工作,如果想要运行,它必须不能与用户互动(不能等待terminal/shell的输入)!--->vim、gedit、就不能在后台执行!
放入后台执行的程序,无法ctrl+c停止!
说明1:加一个'&'的目的:默认情况下,前台进程把Shell给占据了,我们无法进行其他操作,对于那些没有交互的进程,很多
时候,我们希望将其在后台启动,可以在启动参数的时候加一个'&'实现这个目的。
说明2:+号表示最近被放到后台(s、r)的工作号码--> -号表示第二个
问题:通过非终端的形式开启了一个firefox,通过终端又开启了一个firefox(可能在后台运行的吧),但是直接运行完了!
说明:在后台执行的任务,如果有信息输出也会显示在前台控制台上,为了避免与前台命令的输出信息混淆,重定向黑洞解决!
扩展场景:在单一的终端机下同时进行多个工作的管理行为!
####################################
四、进程信号
说明:通过向PID发送信号来控制进程的状态!
生活案例:男女抛媚眼的结果的讨论!女正在与朋友聊天!-->聊天发消息!
常用的进程信号等级(我们能操控)
1 --->进程重新加载(pid号不变)-->修改bug-->不能保证这段时间没人用(双11,争分夺秒)-->用户体验不到变化,不影响正常的上线!
2 --->删除进程在内存中的数据
演示1-->两个终端,一个终端输入内容没有结束(I/O没有关闭),另一个终端想发送信号2删除进程在内存中的数据!
3 --->删除鼠标在内存中的数据---> ctrl+\
9 --->强行结束单个进程(不能被阻塞)
演示3:既然你置之不理,--(中间先开了个火狐,然后打入后台-15来关闭了)--我只好用强了!!!
15 --->正常关闭进程(可能被阻塞)-->我不同意,我还有任务呢!
演示2--->此时接上,想正常关闭此终端,发送15信号,竟然置之不理
17 --->ctrl+z(暂停运行的进程)
18 --->运行暂停的进程--->fg/bg命令
饰演4:gedit --->ctrl-z --->通过ps查询此gedit的gid -->kill -18 pid
19 --->暂停某个进程(不能被阻塞)-->同 Ctrl + Z
饰演5:ps查询gedit的id --->kill -19 pid -->重新暂停
20 --->把进程打入到后台(可以被阻塞)-->次要的,不重要的打死!
理解思路:对比容易混淆的!
1)信号2的演示
测试
2)信号9和15的演示
分析:分别发送9和15信号的区别?导致哪些严重的后果?
3)信号18、19、20的演示
说明:18省略,主要讨论19和20的区别!
相关链接:
4)信号1的演示(核心思想)
(1)前提条件-->安装此服务
netstat -antlupe |grep http -->看端口
说明:开启时加载服务的配置文件
(2)观察服务开启和重启,对应的pid--> 看Main PID-->进程号来标识是否是同一进程!
修改配置文件:vim /etc/httpd/conf/httpd.conf
Listen:改成8080
(3)netstat -antlupe |grep http -->看服务的端口(没有发生变化)-->被有重新加载此配置文件
此时:重启服务--->观察Main pid
netstat -antlupe |grep http -->端口发生变化-->加载了配置文件
重新修改配置文件:vim /etc/httpd/conf/httpd.conf把Listen改回去80
测试:netstat -antlupe |grep http -->端口没有发生变化
(4)重点来了,给此进程发送1的信号(偷偷的加载配置文件)
再netstat -antlupe |grep http -->端口发生变化-->此服务的端口改回为80
systemctl status httpd-->显示发送1信号前后pid没有发生变化
发送信号的工具
kill -信号 进程id -->向内核发送等级信号!
killall -信号 进程的名字(批处理) -->多个vim &,然后。。。
pkill -u 指定用户 -信号 -->对用户进行批处理!
理解:后两个可以理解为通过过滤(某种条件)传递信号!
帮助文档
kill -l #信号
man 7 signal #查看信号的详细信息!(注意7的含义)
五、top命令
1)ps和top的区别
ps--->选取一个时间点的进程状态!
top-->系统监控的命令-->动态查看进程运行的状态!
把握:(1)了解显示信息的含义;(2)交互命令的运用