1.什么是进程?
程序放置在存储媒体中(硬盘、光盘、软盘、磁带等),以实体文件的形态存在
进程:程序被触发后,执行者的权限与属性、程序的程序码与所需数据等都会被载入内存中
操作系统会给内存内的单元一个识别码( PID),也就是说,进程是一个正在运行当中的程序
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占用情况
(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 & 不会占用终端
不是所有的程序都会占用终端
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)用什么控制服务?
采用系统初始化进程对服务进行相应的控制
(3)当前系统初始化进程是什么?
systemd 系统初始化进程
pstree 显示系统的进程树
(4)进程控制命令:
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 设定系统启动级别为图形模式