Linux中的进程管理
文章目录
一.进程定义:
1.进程的定义:
总的来说,进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础:
[1]程序是静态的代码文件。
[2]进程是指程序运行时的形态。
[3]进程是程序的一个副本。
[4]进程是有生命周期的(准备期,运行期,终止期)。
2.进程和线程:
总的来说,线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。则:
[1]进程是资源调用的最小单位。
[2]线程是进程的最小单位。
[3]程序执行流是从上倒下贯穿运行的 。
[4]进程是多任务物,cpu是多核心,多任务应该同时被每个核心处理,每个核心处理的任务叫线程。
[5]线程资源是共享的.。
3.进程状态:
进程状态 | 含义 |
---|---|
R(TASK_RUNNING) | 可执行状态(running,ready) |
S(TASK_INTERRUPTABLE) | 可唤醒休眠 |
T(TASK_UNINTERRUPTABLE) | 不可唤醒休眠 |
D(TASK_STOP) | 暂停态 |
Z(EXIT_ZOMBIE) | 僵死态 |
用食堂大妈打饭这个事件可以形象地理解进程状态,若将打饭这个动作看作执行:
[1]R:食堂打饭已准摆好盘子和饭卡,排队等待阿姨打饭
[2]S:打饭的时候在旁边纠结选哪个菜,阿姨让你先站在旁边等着,等你选好了就可以排队等待阿姨打饭了
[3]T:打饭的时候没有带饭卡,阿姨让你站队伍旁边但是你却不能进行打饭这个操作
[4]D:视频的暂停键
[5]Z:打完饭后由于跟阿姨聊天而导致占了别人的打饭队伍,一直占用着系统资源不放,需要手动清除bug
二.进程命令查看:
1.图形进程查看工具:
命令 | 效果 |
---|---|
gnome-system-monitor | 图形进程查看工具 |
执行命令后的界面:
图片左边所示的就是图形进程查看工具
Dependencies:依赖性,可以形象地用打饭这个程序,每个人都必须要带碗来理解
2.进程查看:
ps命令可以对于系统中的进程进行查看,其中ps命令下包含了三种执行风格,分别是UNIX,BSD,GNU,用man ps可以看到三种执行风格的差异,实际执行ps命令时三种风格的参数是可以混用的:
ps命令 | 效果 |
---|---|
ps a | 与终端相关的进程(当用户登陆系统后产生的进程都是带终端的) |
ps x | 与终端无关的进程 |
ps u | 用户信息归类的查看方式 |
ps f | 进程的层级关系 |
ps o | 显示指定的参数pid,comm,nice,pri,pcpu,ppid,stat,user,group |
ps -e | 显示所有进程 |
ps -f | 显示信息的完整格式 |
ps -H | 显示进程的层级结构 |
ps -o | 显式指定参数 |
ps --sort= | 按一定标准以及顺序排序 |
[1]ps a:与终端相关的进程:
[2]ps x:与终端无关的进程:
ps ax可以显示所有进程:
[3]ps u:用户信息归类的查看方式:
ps aux可以显示所有进程但与ps ax显示的信息不同:
[4]ps f:进程的层级关系:
用ps axf可以显示所有进程的层级关系:
[5]ps o:显示指定参数pid,comm,nice,pri,pcpu,ppid,stat,user,group,各个参数的输入顺序可以颠倒并且可以单独输入,参数之间相互独立互不影响:
[6]ps -e:显示所有进程:
[7]ps -f:显示信息的完整格式:
[8]ps -H:显示进程的层级结构:
[9]ps -o:显式指定参数:
ps -eo %cpu指按进程使用cpu的用量来显示所有进程:
[10]ps --sort==:按一定顺序显示进程信息:
其中以按进程使用cpu的用量来显示:ps -eo %cpu --sort==%cpu是按进程使用cpu从少到多的顺序显示的,ps -eo %cpu --sort==-%cpu是按进程使用cpu从多到少的顺序来显示的:
ps ax显示信息如下:
显示信息 | 内容 |
---|---|
PID | 进程id |
TTY | 进程用到的终端 |
STAT | 进程状态 |
TIME | 进程占用CPU的时长 |
COMMAND | 进程名称 |
ps aux显示信息如下:
显示信息 | 内容 |
---|---|
USER | 进程所有人 |
PID | 进程id |
%CPU | 进程使用CPU的用量 |
%MEM | 进程所用到的内存 |
VSZ | 进程使用的虚拟内存大小 |
RSS | 进程常驻内存的数据大小 |
TTY | 进程使用的终端 |
STAT | 进程状态 |
START | 进程运行时长 |
TIME | 进程占用CPU时长 |
COMMAND | 进程名称 |
3.进程过滤:
pgrep命令可以对于进程进行过滤:
命令 | 效果 |
---|---|
pgrep -u uid | 显示指定用户的进程 |
pgrep -U user | 显示指定用户的进程 |
pgrep -t tty | 显示指定终端的进程 |
pgrep -l | 显示进程的名称 |
pgrep -a | 显示进程的完整名称 |
pgrep -P | 显示进程的子进程 |
[1]-u uid:显示指定用户的进程;-U user:显示指定用户的进程:
由实验现象可得运行结果均为34680,对应ps运行结果中的进程bash,因此可得pgrep过滤出的结果为PID
[2]-t tty:显示指定终端的进程;-l:显示进程的名称;
-a:显示进程的完整名称:
由上一个实验得知tty为pts/0,则运行-t可得当前进程的PID,运行-lt显示PID和进程名称,运行-alt显示PID和完整名称,如上图所示
[3]-P:显示进程的子进程:
在-alt的基础上查看子进程,并在ps axf中找到对应PID下的进程就可以得到验证。
4.查看进程的PID:
命令 | 效果 |
---|---|
pidof | 查看进程PID |
5.动态进程查看:
top命令可以对进程进行动态查看:
top命令默认初始界面:
[1]第一行:top - 08:18:27 是系统时间,up 13:45 是运行时长,1 user 是当前系统中有1个用户,load average:0.07 0.05 0.01对应1min,5min,15min
[2]第二行:Tasks:324 total 是任务总量,5 running是正在运行,319 sleeping是休眠任务数量,0 stopped被暂停数量,0 zombie是僵死任务数量
[3]第三行:%Cpu(s)中21.6 us是用户空间,5.1 sy是内核空间,0.0ni是nice值调整时间,72.6 id是空闲时间,0.0 wa是等待io时间,0.7 hi是处理硬件中断时间,0.0 si是处理软件中断时间,0.0 st是被偷走的时间(vm使用时间)
[4]第四行:MiB Mem中1800.6 total是总量,194.7 free是空闲,1239.3 used是占用,366.6 buff/cache是缓存
[5]第五行:MiB Swap(交换分区用量)
top外部命令:
命令 | 效果 |
---|---|
top -d 数字 | 指定刷新频率 |
top -b | 以批次方式显示 |
top -n 数字 | 以指定批次方式显示 |
[1]top -d:执行top -d 1(刷新频率为1秒1次):
[2]top -b/top -n 数字:以批次显示:
top内部命令:即先执行top后在top程序内部执行相关命令:
命令 | 效果 |
---|---|
P | cpu排序 |
M | 内存排序 |
T | 累计占用时间排序 |
l | 关闭/开启uptime信息 |
t | 关闭/开启cpu&task |
s | 指定刷新频率 |
k | 操作进程(需要提前知道被操作进程的PID) |
u | 查看指定用户进程 |
[1]P:cpu排序
[2]M:内存排序
[3]T:累计占用时间排序
[4]l:关闭/开启uptime信息
可以对比top程序界面,发现最上面一行消失。
[5]t:关闭/开启cpu和task
可以对比top程序界面,发现二,三行消失。
[6]s: 指定刷新频率
[7]k:操作进程:
首先打开另一个shell并执行命令vim,后在另一个shell中得到vim的pid,在按k后输入pid
enter后显示操作信号,输入操作信号15
操作后的结果就是将进程vim关闭
[8]u:查看指定用户进程
另开一个shell后登录其他用户并执行一个watch,在top中按u后输入该用户的名称
enter后就能看到该用户现在在执行的进程
若按u后不加任何用户名称,则系统默认为所有用户,所以top界面将回到默认初始界面。
三.进程优先级:
1.进程优先级:
[1]系统是多任务多用户的操作模式,任务的重要性是有区分的,如何确定任务的重要性?–优先级
[2]“优先级”范围: 0–139
[3]内核自控优先级范围:0-99
[4]用户可控优先级:100-139
[5]nice在Linux中的值范围是:-20-19,值越小,级越高;pri在Linux中的值的范围是:39-0,值越大,级越高,且nice和pri都是用户可控的优先级范围
2.进程优先级修改命令:
命令 | 效果 |
---|---|
renice -n -5 进程id | 将该进程优先级更改至5 |
nice -n -5 cat | 指定优先级并打开进程 |
[1]renice执行时首先要用ps o comm,pri,nice,pid,stat查看进程对应pid,pri,ni后进行操作:
[2]nice:
3.进程优先级显示:
符号 | 含义 |
---|---|
S | sleeping |
< | 优先级高 |
s | 顶级进程 |
T | stop |
N | 优先级低 |
R | running |
+ | 运行在前台 |
四.进程前后台调用:
命令 | 效果 |
---|---|
ctl+z | 把占用shell的进程打入后台挂起 |
bg | 把后台挂起的进程运行起来 |
fg | 把后台挂起的进程调回前台 |
& | 运行进程在后台 |
jobs | 查看当前shell中在后台的所有工作 |
整体实验:
分部实验:
[1]首先先执行gedit,再用ctl+z将gedit打入后台挂起,后用jobs查看,发现gedit无法编辑:
[2]然后用fg 1将gedit从后台挂起的状态调回前台,并且此时gedit可以进行编辑:
[3]再用ctl+z将gedit打入后台,用bg 1将gedit运行起来,但此时对应gedit状态有 & 显示,表明gedit运行程序在后台:
[4]实验结束时用ctl+c将gedit关闭,若用vim程序作为实验素材,则最后关闭用q,q!,wq,wq!退出vim模式即可。
五.进程信号信息:
1.进程信号:
信号 | 效果 |
---|---|
1 | 重新加载系统配置文件 |
2 | 清空内存中的进程数据 |
3 | 清空内存中的鼠标(ctrl+) |
9 | 强行结束进程(不能被阻塞) |
15 | 正常关闭进程(会阻塞) |
18 | 运行被暂停的进程 |
19 | 暂停进程(不会被阻塞) |
20 | 暂停进程(会被阻塞) |
2.进程信号控制工具:
命令 |
---|
kill 进程信号 PID |
killall 进程信号 进程名字 |
pkill 进程信号 进程条件 |
实验时加你个进程信号控制工具与进程信号配合实验:
信号9和信号15都可以关闭进程,信号9更加强制,信号15关闭正常进程可以,但是对于被打入后台挂起的gedit进程则无法关闭
对于信号19和信号20,都可以暂停,但是信号19暂停时在上图所示左边的shell中依然可以输入,但是不会显示,在右边shell中用信号18开启显示后会看到刚才在暂停期间输入的指令,而信号20的阻塞会使在暂停中无法将输入的指令记录,因此在信号18开启显示以后也无法显示刚才暂停期间新输入的指令。
六.systemd守护进程:
1.远程操作主机:
ssh命令可以远程操作主机:
命令 |
---|
ssh -l 远程主机用户 远程主机ipadress |
本实验环境是两个虚拟机,一个ipaddress为172.25.254.100,另一个为172.25.254.200,两个虚拟机之间相互连接:
如图所示,本实验是从172.25.254.100连接到172.25.254.200上,在实验中要通过ifconfig来查看当前用户的ipaddress,在执行ssh命令时,需要知道并输入被登录用户的密码,并且在首次登录时需要用yes/no回答系统问题。
2.守护进程:
守护进程:替内核分担程序控管的程序,通常PID为1,systemd–>systemctl,systemctl为管理系统服务,服务指在系统中开启的共享系统资源到网络中的程序。cs指client–server
3.systemctl命令用法:
命令 | 效果 |
---|---|
start | 开启 |
stop | 关闭 |
status | 查看状态 |
reload | 重新加载 |
restart | 重新启动服务 |
enable | 设定服务开机启动 |
enable --now | 设定服务开机启动并当前开启服务 |
disable | 设定服务开启不启动 |
list-units | 查看系统所有服务当前状态 |
list-unit-files | 查看服务开机状态 |
list-dependencies | 列服务依赖性 |
mask | 冻结服务 |
unmask | 解锁 |
[1]start和stop,以及用status查看当前状态:
用status查看当前状态界面如上图所示,使用start命令后系统状态变为active(runnning),使用stop后状态变为inactive(dead)
在start状态下可以发现,两个虚拟机之间可以用ssh可以正常登录:
若将状态更改为stop,则不能用ssh登录,会显示登录失败:
[2]reload和restart:
reload和restart有相似之处也有不同之处,reload和restart都能刷新sshd的状态,但是reload不会改变ip,restart会刷新ip,等于reload相当于游戏中的不停服的更新,而restart相当于游戏中的停服更新
[3]enable和disable:
[4]list-units,list-unit-files,list-dependencies:
[5]mask和unmask:
sshd用mask锁定以后用状态查看时,会显示当前状态为已锁定状态,而用unmask解锁后状态会显示正常状态
用mask锁定后将无法修改其状态,status显示当前状态为已锁定,关闭状态,再用start命令去使其开启就会报错,显示更改失败。
用set-default可以设定系统运行模式:
命令 | 效果 |
---|---|
set-default multi-user.target | 无图形网络模式 |
set-default graphical.target | 有图形网络模式 |
用get-default可以查看系统运行状态:
数字 | 效果 |
---|---|
0 | POWEROFF |
1 | single |
2 | noG+NETWORK |
3 | noG+NETWORK |
4 | noG+NETWORK |
5 | G+NETWORK |
6 | REBOOT |
set-default和get-default的实验对应进行:
七.系统中的登录审计:
命令 | 效果 |
---|---|
w | 显示正在登录系统的账号 |
w -i | 显示正在登录系统的账号及其登录来源 |
last | 显示登录成功但现在已经退出了的账号 |
lastb | 显示试图登录但未成功的账号 |
[1]用172.25.254.100登录172.25.254.200,并在172.25.254.200中可以清晰地看到当前172.25.254.100正在登录当中:
[2]last可以查看成功的登陆记录,lastb可以查看不成功的登录记录:
用last命令可以清晰地看到172.25.254.100用户成功登录的次数和登录时间等,同时在实验时在172.25.254.100用户登录时故意输错密码三次,在172.25.254.200中用lastb就可以看到172.25.254.100有三次失败的登录记录。
w,last,lastb三个命令分别将其信息存储在不同的文件中:
命令 | 对应文件 |
---|---|
w | /var/run/utmp |
last | /var/log/wtmp |
lastb | /var/log/btmp |
实验时可以用输出重定向清空文件内容,也可以删除文件,删除后记得新建一个原文件