Linux中的进程管理
什么是进程
进程定义
程序是静态的代码文件
进程是指程序运行时的形态
进程是程序的一个副本
进程是有生命周期的,即准备期 运行期 终止期
进程与线程
作为两个常听到的名词,进程和线程很容易被搞混.
进程是资源调用的最小单位
线程是进程的最小单位
当代使用计算机时候常听到多核心这个概念,实际上当我们运行程序时,如果需要同时执行多个任务/操作,为了保证运行效率,任务就会交给多个核心进行处理.每个核心处理的任务就叫做线程.简而言之,一个程序至少有一个进程,一个进程至少有一个线程,线程增加了程序的并发性.
进程查看命令
提到了进程,当然得学习如何查看,不然仅仅了解概念显然是没什么用的.
查看进程的方式有两种,图形化的和非图形化的.
gnome-system-monitor ##图形化进程查看工具
ps #进程查看,shell中常用,不依赖图形界面
由于进程包含的信息繁多,因此理所当然的,ps
命令所能添加的参数也很多.
当不加参数默认运行ps
命令时会列出当前用户正在运行进程的简单信息.
ps命令的参数
ps
命令有三种执行风格: unix bsd GNU,大体上可通过参数前是否有 -
进行区分.
ps #进程查看
#a 与终端相关的进程(当用户登陆系统后产生的进程都是带终端的)
#x 与终端无关相关的进程
#u 用户信息归类的查看方式
#f 进程层级关系
#o 显示指定参数,如 pid comm nice pri pcpu ppid stat user group
#-e 显示所有进程
#-f 显示信息的完整格式
#-H 显示进程的层级结构
#-o 显示指定参数
#--sort= 按照制定参数排序,参数前添加"-"表示逆序
参数之间可以排列组合,按需添加.
ps ax
#ps ax显示信息如下:
PID 进程id
TTY 进程用到的终端
STAT 进程状态
TIME 进程占用cpu时长
COMMAND 进程名称
如果再附加u
参数
ps aux
则会得到以下结果
#ps aux显示信息如下:
USER 进程所有人
PID 进程id
%CPU 进程使用cpu的用量
%MEM 进程所用到的内存用量
VSZ 进程使用的虚拟内存大小
RSS 进程常驻内存中的数据大小
TTY 进程用到的终端
STAT 进程状态
START 进程运行时长
TIME 进程占用cpu时长
COMMAND 进程名称
显然我们并不是任何时候都需要获取所有这些参数,因此按需获取信息也是查询的必要方法之一.
ps ax -o user,group,pid,%cpu,stat,comm --sort=%cpu
如上所示,可以按CPU占用率从小到大对所有进程进行排列显示
获取的进程信息包含所有者,所有组,进程ID,CPU占用率,进程状态,进程名
当然,当需要逆序排列时候也很简单
--sort=%cpu 改为 --sort=-%cpu 即可
进程状态
既然上面的参数提到了进程状态,还是系统的梳理一下为好.
R(TAKS_RUNNING) ##可执行态(running,ready)
S(TASK_INTRRUPTABLE) ##可唤醒休眠
D(TASK_UNINTRRUPTABLE) ##不可唤醒休眠
T(TASK_STOP) ##暂停状态
Z(EXIT_ZOMBIE) ##僵死态
进程过滤
既然刚才已经使用过ps ax
了,那显然你对它到底列出了多长的进程串也有所体会,日常使用中我们大部分时候都只想找到自己想要的进程,这时候就要用到进程过滤.
pgrep #进程过滤命令
#-u uid 显示指定用户进程
#-U user 显示指定用户进程
#-t tty 显示指定终端进程
#-l 显示进程名称
#-a 显示进程的完整名称
#-P 显示进程的子进程
同样,当我们知道进程名称时也可以使用如下指令反查进程ID
pidof 进程名称
动态进程查看
ps
命令确实可以查询进程情况,但系统的运行是个动态的过程,监控也势必有即时的要求,一直动用watch
总不是个办法,还好有原生的动态查看命令解决了这个问题.
top ##动态进程查看
top命令实现了对于进程的动态查看,但由于执行后的界面内容实在太多,专门拿出来讲可能比较好.
如图,top
运行后分为了上下两个部分.上半部分主要为系统的信息,下半部分就是对于进程的动态监控了.顺便一体,top
命令会占用shell,在结束前不能执行其他命令.
上半部分包括了 系统时间, 当前登陆的用户数量, 1/5/15分钟内的系统平均负载, 进程总数和各个状态的进程数量, CPU占用量, 内存占用量, 交换分区的占用量
下半部分就比较直观了
参数 | 含义 |
---|---|
PID | 进程ID |
USER | 进程的拥有者 |
PR | 进程优先级 |
NI | NICE值,也表示优先级概念 |
VIRT | 虚拟内存使用量,单位为KB |
RES | 物理内存使用量,单位为KB |
SHR | 共享内存大小,单位为KB |
S | 进程状态 |
对于top
命令附加参数方法有两种,运行前提前附加的参数以及运行中实时附加的参数.
运行前附加的参数
-d 指定刷新频率
-b 以批次方式显示
-n 指定显示的批次数量
运行中的内部参数
P 按cpu占用量排序,按两次则逆序
M 按内存占用量排序,按两次则逆序
T 累计占用cpu时间排序,按两次则逆序
l 关闭/开启uptime信息
t 关闭/开启cpu&task
s 指定刷新频率
k 操作进程
u 查看指定用户进程
进程优先级
显然,按照我们的认知,任务和任务之间的优先度是不同的,打个比方如果网络服务中断了,即使联网应用本身没有出问题显然也无法正确为你服务了.
任务的重要性是有区分的,那该如何确定任务的重要性呢?
我们采用优先级的方式对进程重要程度进行量化
“优先级”
范围: 0–139
内核自控优先级范围:0-99
用户可控优先级:100-139
同时在上文中提过NICE值的概念,并且说它也是对于优先度的反映.
nice值的范围是-20 到 19,数值越小优先级越高,反之越大越低.
那么显而易见的,我们当然可以指定进程以指定优先级运行.
当然,对于已经在运行的进程,我们也可以修改其优先级.
但是优先级只能调低不能调高,需要特别记忆.
这涉及到两条命令.
nice -n -5 vim & ##指定优先级(-5)打开进程(这里指vim)
renice -n -5 43331 ##更改优先级,在这里是将43331进程的优先级改为-5
以下为举例.
关于进程状态的补充
S #sleeping
< #优先级高
s #顶级进程
T #stop
N #优先级底
R #running
+ #运行在前台
进程的前后台调用
在之前的内容中我们讲过,当你执行类似如下指令时,shell会被占用
gedit #打开图形化的记事本
在linux系统中当然也有将前台进程放到后台和从后台转回前台的方法,具体操作如下.
<ctrl>+<z> ##把占用shell的进程打入后台挂起
bg ##把后台挂起的进程运行起来
fg ##把后台进程调回前台
& ##运行进程在后台
jobs ##查看当前shell中在后台的所有工作
以图例进行讲解.
进程信号相关操作
在之前讲top
的内部指令时有一条是这样的.
k 操作进程
那么进程是如何操作的,进程信号又有哪些呢?
进程信号有1-20这20种,但只有以下这些是可以供我们拿来操作的.
1 #重新加载系统配置文件
2 #清空内存中的进程数据
3 #清空内存中的鼠标(ctrl+\)
9 #强行结束进程(不能被阻塞)
15 #正常关闭进程(会被阻塞)
18 #运行被暂停的进程
19 #暂停进程(不会被阻塞)
20 #暂停进程(会被阻塞的)
关于阻塞和非阻塞,可以理解为,当进程被占用不可进行操作时为阻塞,强制执行则为非阻塞,比如挂起的进程如果使用20则无法关闭,19则可以强制关闭它.
值得一提的是,暂停的进程本身依旧存在,只是暂时不接受数据了,比如你挂起了记事本,再输入信息都无法录入.但是这些信息本身并没有消失,当你运行被暂停的记事本时,刚刚输入的信息都会瞬间进入记事本窗口内.
那么知道了操作信号,就该用到以下指令对进程进行操作了.
#进程信号控制工具
kill 进程信号 pid #对进程进行操作
killall 进程信号 进程名字 #对符合进程名的进程批量进行操作
pkill 进程信号 进程条件 #对符合条件的进程进行操作,可以指定进程所有者等等条件,相当于扩大版的killall
systemd守护进程
什么是守护进程
守护进程(daemon)是生存期长的一种进程,没有控制终端.它们常常在系统引导装入时启动,仅在系统关闭时才终止.
它们替内核分担程序控管的程序.
#通常pid为1
#systemd -----> systemctl
#systemctl 管理系统服务
systemctl命令的用法
systemctl命令是系统服务管理器指令,用于对服务进行管理.服务指在系统中开启的共享系统资源到网络中的程序.
systemctl start 进程名 ##开启服务
systemctl stop 进程名 ##关闭服务
systemctl status 进程名 ##查看服务状态
systemctl reload 进程名 ##重新加载指定服务
systemctl restart 进程名 ##重新启动服务
systemctl enable 进程名 ##设定服务开机启动
systemctl enable --now 进程名 ##设定服务开机启动并开启服务
systemctl disable 进程名 ##设定服务开机不启动
systemctl disable --now 进程名 ##设定服务开机不启动并结束服务
systemctl list-units ##查看系统所有服务当前状态
systemctl list-unit-files ##查看服务开机状态
systemctl list-dependencies ##列出服务依赖性
systemctl mask 进程名 ##冻结指定服务
systemctl unmask 进程名 ##解锁指定服务
systemctl set-default ##设定系统运行模式
#multi-user.target 无图形网络模式
#graphical.target 有图形的网络模式
systemctl get-default ##查看系统运行模式
对服务的管理也常用于对于服务端的管理中.
提到服务端就一定会牵扯到C/S架构,即服务端与客户端的区别.
一般认为提供服务的主机为服务端,使用功能的为客户端.
系统中的登陆审计
提到了服务端,自然也会想到远程控制和远端登陆.
事实上,每一次SSH连接都会在被连接主机上进行记录,我们也可以通过以下指令对当前连接用户和历史连接情况进行查看.
w ##显示正在登陆系统的账号
## -i 显示登陆来源
#/var/run/utmp 对应的文件位置
last ##登陆成功现在已经退出的
##/var/log/wtmp 对应的文件位置
lastb ##试图登陆但未成功
##/var/log/btmp 对应的文件位置