1.什么是进程?
我的理解:
程序正在运行的状态为进程 ,也就是cpu未完成的工作
进程是正在运行的程序的实例,程序并不是进程
进程就是系统未完成并正在进行的工作
官方定义:
程序放置在存储媒体中(硬盘、光盘、软盘、磁带等),以实体文件的形态存在
进程:程序被触发后,执行者的权限与属性、程序的程序码与所需数据等都会被载入内存中
操作系统会给内存内的单元一个识别码( PID),也就是说,进程是一个正在运行当中的程序
举例:
错误认知 | /bin/watch 该二进制文件里面记录了产生进程的程序 ,并不是进程 |
---|---|
正确认知 | /bin/watch -n 1 date 为开启一个进程,程序被运行起来为进程,在cpu和内存中存放 |
注意:应学会运行一个进程并且查看该进程的各种信息 ,例如:processes
知道了什么是进程以后,接下来我们一起看看和进程相关的一些内容吧!
2.进程的基本实验环境
和进程相关的实验操作是在一台虚拟机当中进行,我使用desktop虚拟机
在真机里面开启一台虚拟机的操作如下:
3.进程运行的状态
R( running) | 表示此进程正在使用当中 |
---|---|
S(sleep) | 睡眠状态,将一个进程最小化时,相当于该进程被优化了,可以直接被唤醒 |
Z(zombine ) | 僵尸状态 ,该进程占用系统资源并不为系统服务,属于异常状态 |
T(stop) | 停止状态,可能是被控制或者出错了,不能直接唤醒,但可以用命令强制唤醒 |
D | 不可被唤醒的睡眠状态,通常是进程可能在等待I/O的情况下 |
比如:
注意:
可以直接在进程图形界面中查看
一个进程停止不等于进程结束
4.如何查看系统的进程?
有两种方式:图形方式和命令方式
图形方式和命令方式的区别在于:
图形方式展示的进程为图形界面
命令方式展示的进程为shell里面的文本模式
(1)图形方式查看进程:
直接在shell里面输入命令:gnome-system-monitor 回车即可看到进程
(2)命令方式查看进程:
在shell里面输入相应的命令即可查看相应的进程信息
采用ps命令 ,可以用 man ps来查看它的使用方法
ps ##ps自己所在的shell里面运行的进程
ps a ##在shell当中运行的所有进程,包括shell的环境bash
ps -a ### 在shell当中运行的所有进程,不包括shell环境本身信息bash
注意:所有shell的环境一样,具体id不一样
ps -A ###系统当中所有的进程,与shell无关
ps -d ###与A类似 ,没有允许环境(shell)
ps -e ###显示进程的扩展信息(系统资源),与-A 差不多
ps x ###显示所有输出设备终端的进程
ps -u ###显示用户信息 ,id等等 ,终端 ,各种时间
ps -f ###显示副级进程以及子进程
(3)用来查看进程的常用的ps组合:
ps aux ##显示系统当中的所有进程并显示进程用户
ps ef ##显示进程的详细信息以及进程的父子关系
ps ax ##显示当前系统当中的所有进程
pstree ##显示当前系统的进程树
并不是父级进程结束以后子进程一定会结束
剩下的子进程叫孤儿进程 ,因为父级进程被强行关闭 ,这样会影响系统的正常运行
正常应该先结束子进程,再结束父进程
一般由系统的初始化程序来控制其他进程的开始和结束
可以用pstree查看系统的进程树(父进程和子进程关系一目了然)
systemd为初始化程序,是所有程序的父级程序,不会自己关闭结束自己,只有关机才可以,或者结束了所有子进程以后,该初始化进程才会被关闭
(4)显示进程的指定信息
命令格式: ps -o xxx 显示进程的指定信息
xxx可以为以下内容:
comm 进程名称
user 进程所有人
group 进程所有组
%cpu 进程cpu使用率
%men 进程内存使用率
pid 进程的id
nice 进程优先级
###ps -o comm(名字)
###ps -o user(所有人)
###ps -o group(所有组)
###ps -o %cpu
###ps -o %mem (内存)
###ps -o pid(id号码)
###ps -o nice(优先级)
###tty为所处环境,stat为所处状态
(5)进程排序
命令格式为:ps ax --sort=要显示的东西
ps --sort=%cpu
ps -A --sort=%cpu
ps -A --sort=%cpu -o %cpu
ps -A --sort=%mem -o %mem
总结:
ps ax --sort=%men -o %men(升序)
ps ax --sort=-%men -o %men(降序)
ps ax --sort=%cpu -o %cpu(升序)
ps ax --sort=-%cpu -o %cpu(降序)
第一部分表示显示所有进程
第二部分表示对mem内存或者cpu占用进行排序, -表示降序
第三部分表示只显示mem内存或者cpu占用情况
面试题:memory +5 pid 显示内存当中pid的前五个
命令: ps -A --sort=-%mem -o %pid |head -n 6 | tail -n 5
命令:ps -A --sort=-%mem -o pid |head -n 6 | tail -n 5
(6)进程的stat中显示的信息含义:
S | 进程状态 |
---|---|
s | 没有父进程,顶级进程 |
l | 在内存当中有锁定空间(进程结束之前不会被系统回收) |
+ | 正在前台运行的进程 |
N | 表示优先级低 |
< | 表示优先级高 |
5.进程的优先级
(1)进程的优先级范围: -20~19
(2)优先级的查看:ps ax -o pid,nice,comm
(3)怎样调整进程的优先级?
方法一:图形调整进程的优先级,直接在进程的图形界面里面调整数字
大数字 : 表示优先级低 S后会出现N
小数字(可以是负数): 表示优先级高 S后会出现<
所以N表示优先级低
<表示优先级高
方法二:命令设定进程优先级,以下都是直接在shell里面输入命令即可
指定某个优先级开启进程(先指定,后开启)
nice -n 优先级数字 进程名称
比如:nice -n -5 vim 开启vim并且指定该程序的优先级为-5
改变进程的优先级(先开启,后改变)
renice -n 优先级数字 进程pid
renice -n -5 1542 改变1542进程的优先级为-5
改变进程的优先级:renice -n 4 进程名字;进程pid 将该进程的优先级改为4, ,先开启进程 ps查看 ,再renice 再ps查看看有没有改变优先级
监控进程:watch -n 1 ps -o stat,comm,pid,nice(nice表示优先级)
watch -n 1 ps a -o stat,comm,pid,nice 先指定优先级 再开启进程 用ps查看即可
指定进程的优先级:nice -n 1 进程名字 ,直接指定该进程的优先级,该进程并没有启动
renice命令的实验过程:
步骤一:先开启进程, 直接在desktop主机的shell当中输入 firefox
步骤二:监控进程 watch -n 1 ps -o stat,comm,pid,nice(nice表示优先级)
步骤三:用renice -n 10 2176(更改所要设定的进程的id号,改变优先级)
nice命令的实验过程:
步骤:nice -n -5 firefox(开启的同时指定优先级)
nice后面跟的firefox(进程名)开启进程
只有nice是不能开启进程的
用nice先告诉系统firefox的进程到底重不重要(给它优先级)
再开启firefox ,查看的时候就是 -5 了
注意:
同一个shell当中的两个窗口优先级互不影响
多个shell当中的优先级互相影响
系统当中只能有一个firefox的进程 ,一个进程开启了多个界面
6.环境中进程的前后台调用:
(1)前后台调用的常用命令:
jobs | 查看被打入环境后台的进程 |
---|---|
ctrl+z | 把占用终端的进程打入后台 |
fg+jobsnum | 把后台的进程调回前台 |
bg+jobsnum | 把后台暂停的进程运行起来 |
comm+& | 让命令直接运行在后台 |
(2)具体步骤如下:
步骤一:先用在desktop主机中输入gedit 或者 firefox, 此进程会占用终端,使终端不能使用
gedit编辑模式占用终端
步骤二:直接在shell脚本输入 ctrl+z 打入后台
ctrl+z将该进程直接打入后台(挂在后台不再运行)
如果使用gedit &打入后台它在后台还是运行的
步骤三:输入jobs查看被打入后台的进程
步骤四: fg 数字 ,将被打入后台的进程调回前台(终端)
步骤五:bg 数字 ,将被打入后台的暂停的进程运行起来
步骤六:使用 comm(名字) &, 让命令直接在后台运行
先打入后台的优先级低,后打入后台的优先级高
优先处理和优先调用不一样
ctrl + z把前台正在运行的程序打入后台
+表示正在运行 , -表示为次优先
如果没有+(把一个进程调回前台) , -就会被自动变为+(优先级提高)
vim 不能在后台运行, 也就是 vim & 不会占用终端
不是所有的程序都会占用终端
在真机里面可以演示:
eject /dev/sdb1可以完全把u盘弹出
eject 弹出光驱
7.常用进程信号:
(1)常用信号等级:
每个信号代表的意思如表下所示:
1 | 进程重新加载配置,进程不会关闭(意义重大) |
---|---|
2 | 删除进程在内存中的数据 |
3 | 删除鼠标在内存中的数据 |
9 | 强行结束单个进程(不能被阻塞) |
15 | 正常关闭进程(可能会被阻塞) |
18 | 运暂停的进程 |
19 | 暂停某个进程(不能被阻塞) |
20 | 把进程打入后台(可以被阻塞) |
man 7 signal | 查看信号详细信息 |
kill -信号 进程的pid(结束这个信号 ,精准处理)
killall -信号 进程名字(可以批量结束) 比如:killall -2 vim
pkill -u student -信号 (结束所有普通用户student) ,对用户进程进行处理 比如:pkill -9 -u student
kill -信号 进程的pid(结束这个信号 ,精准处理)
killall -信号 进程名字(可以批量结束)
pkill -u student -信号 (结束所有普通用户student) ,对用户进程进行处理 比如:pkill -9 -u student
pkill -9 -P 父级pid (强制结束父级进程下的所有进程)
pkill -15 -P 父级pid (可能会被阻塞)
进程不能随便关闭,否则会造成很大的损失
注意:ctrl + / 清除鼠标
8.进程的动态监控:
(1)动态监控使用top命令
top 后面的参数如下表所示:
1(小写l) | 显示cpu每个核的负载 |
---|---|
s | 调整刷新频率 |
c | cpu负载排序 |
m | 内存使用量排序 |
h | 查看帮助 |
u | 查看指定用户进程 |
k | 对指定信号发起进程 |
q | 退出 |
(2)实验操作如下:
实验步骤:
先再shell里面输入top命令,对进程进行实时监控
然后输入相应的字符对其进行动态查看(可以调整动态查看的参数)
回车相当于手动刷新
##输入top动态监控如下:
##按下 1 显示cpu每个核的负载
##按下 s 调整刷新频率
##按下 c cpu负载排序
##按下 m 内存使用量排序
##按下 h 查看帮助
##按下 u 查看指定用户进程
##按下 k 对指定信号发起进程
##按下q , 退出
9.控制服务
(1)服务是什么?
服务也是进程,是多个进程的集合
对自己没有意义,但对客户有意义
说明:要区分客户端和服务端
客户端:要分享别人,连接方
服务端:远程的主机,可以共享资源 (前提是安全共享),被连接方
(2)搭建实验环境
步骤一:先在虚拟机desktop里面进行网络配置
==注意:==添加网络时不能有空的
注意:此时添加的和查看的ip均为172.25.251.111,说明配置网络成功
步骤二:在真机里面ping一下虚拟机,看是否能够ping通
注意:能ping通,再次说明网络配置成功
步骤三:在ping通的基础上使用真机远程连接控制虚拟机(具体命令讲解在sshd服务里面)
连接时要注意书写的格式,用户可以为虚拟机desktop任意一个存在的用户,ip地址是虚拟机的,(记住拿谁家的钥匙开谁家的门)
步骤四:在客户端(真机连接虚拟机的那个shell)切换到桌面 cd Desktop,然后touch file
直接可以看到真机可以控制虚拟机,建立文件,说明真机可以远程控制虚拟机了
(3)用什么控制服务?
采用系统初始化进程对服务进行相应的控制
(4)当前系统初始化进程是什么?
systemd 系统初始化进程
pstree 显示系统的进程树
(5)进程控制命令:
###systemctl 服务控制命令(服务相当于进程)
在真机的客户端shell中输入systemctl,可以看到desktop虚拟机的相关服务
systemctl status sshd 查看服务状态,inactive(不可用),active(可用)
systemctl start sshd 开启服务
systemctl stop sshd 关闭服务
systemctl restart sshd 重启服务
systemctl reload sshd 重新加载服务配置
systemctl enable sshd 设定服务开机启动
systemctl disable sshd 设定服务开机不启动
systemctl list-units 列出已经开启服务当前状态
systemctl list-unit-files 列出所有服务开机启动的状态 disable enable static
systemctl list-dependencies 列出服务的依赖性(列出进程树,也就是父子关系,可以看出依赖性)
systemctl set-default multi-user.target 设定系统启动级别为多用户模式(无图形)
systemctl set-default graphical.target 设定系统启动级别为图形模式
###在客户端输入 systemctl status sshd 查看服务状态,inactive(不可用),active(可用)
###systemctl start sshd 开启服务
###systemctl stop sshd 关闭服务
###systemctl restart sshd 重启服务
###systemctl reload sshd 重新加载服务配置
###systemctl enable sshd 设定服务开机启动
###systemctl disable sshd 设定服务开机不启动
###systemctl list-units 列出已经开启服务当前状态
###systemctl list-unit-files 列出所有服务开机启动的状态 disable enable static
###systemctl list-dependencies 列出服务的依赖性(列出进程树,也就是父子关系,可以看出依赖性)
###systemctl set-default multi-user.target 设定系统启动级别为多用户模式(无图形)
###systemctl set-default graphical.target 设定系统启动级别为图形模式
注意:
sshb是举的一个例子,也可以操作其他服务
running(未退出), exited(退出) ,二者均为运行状态,只是退出和没退出的区别
所有的服务状态如下: static disable enable masked(一共四种)
将mask(封锁)改为unmask(解锁) 命令为 :systemctl unmask 服务名(进程名) ,即可解锁
然后该服务的状态变为tatic disable enable这三个当中的任意一个
具体解锁步骤如下:
步骤一:先systemctl list-unit-files 列出所有服务开机启动的状态 disable enable static masked
步骤二:把masked被锁住的变为解锁systemctl unmask 服务名(进程名)
步骤三:恢复被锁住的状态用systemctl mask 服务名(进程名)