系统进程管理
一、进程概述
1.1 什么是进程?进程管理需要做什么?
- 进程是已启动的运行实例,进程有以下组成部分:
已分配内存的地址空间
进程ID
程序的代码
进程状态
-
进程管理包括进程调度、中断处理、信号、进程优先级、进程切换、进程装填、进程内存等等
进程的生命周期
描述如下:
父进程复制自己的地址空间 创建一个新的子进程结构。
每个新进程分配一个唯一的进程ID(PID)
所有进程都是第一个系统进程的后代
centos5或6PID为1的进程是:init
centos7PID为1的进程是systemd
僵尸进程:不执行代码,占用内存地址空间
如果父进程没能接收子进程退出信号,那么子进程变为僵尸进程
kill命令是不能杀死僵尸进程的
解决问题方法:杀死僵尸进程的父进程或者重启系统
线程:
线程是进程中产生的一个执行单元,在同一个进程中与其他线程并行运行
线程之间可以共享资源,比如内存、地址空间、打开文件等。
上下文切换:
cpu运行进程的切换而导致运行代码的切换叫做上下文切换
进程运行的代码叫上下文
中断处理:
中断是优先级最高的任务之一。
大量中断会导致性能下降
注意:在Linux当中有两种类型的中断。
硬中断:是由硬件产生的,需要快速响应(磁盘IO中断、键盘中断、鼠标中断)
软中断:用来处理可以推迟的任务(TCP/IP、SCSI协议等操作)
1.2 进程的属性
进程ID(PID):是唯一的数值
父进程的ID(PPID)
启动线程的用户ID(UID)和所归属的组(GID)
进程状态:状态分为运行R、休眠S、僵尸Z
进程执行的优先级
进程所连接的终端名
进程资源占用:比如占用资源大小(内存、CPU占用量)
二、管理进程
2.1 使用ps查看进程工具
shell
ps查看进程工具
常用的参数
-a:显示跟当前终端关联的所有进程
-u:基于用户格式显示
-x:显示所有进程,不以终端机区分
shell
[root@localhost ~]# ps -aux | more
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
USER:正在运行的用户
PID:进程的ID
%CPU:进程占用的CPU百分比
%MEM 占用内存的百分比;
VSZ:进程占用的虚拟内存大小(单位:KB)
RSS:进程占用的物理内存大小(单位:KB)
STAT:该程序目前的状态,Linux 进程有 5 种基本状态:
R :该程序目前正在运行
S :该程序目前正在睡眠当中
T :该程序目前是停止状态
Z :该程序应该已经终止,但是其父程序却没有正常的终止它;
D 不可中断的睡眠状态,通常存在于 I/O 情况下;
5 个基本状态后,还可以加一些字母,比如:Ss、R+,如下图:
它们含意如下::
<: 表示进程运行在高优先级上
N: 表示进程运行在低优先级上
L: 表示进程有页面锁定在内存中
s: 表示进程是控制进程
l: 表示进程是多线程的
+: 表示当前进程运行在前台
START:该进程被触发启动的时间;
TIME :该进程实际使用 CPU 运行的时间。
COMMAND:该程序的实际指令
shell
#在另一个终端查看a文件
[yang@localhost ~]$ vim a.txt
[root@localhost ~]# ps -aux | grep "a.txt"
yang 9738 0.0 0.5 151524 5028 pts/2 S+ 04:35 0:00 vim a.txt
root 9740 0.0 0.1 112724 1000 pts/1 R+ 04:35 0:00 grep --color=auto a.txt
2.2 ps -ef 显示所有完整格式进程
shell
[root@localhost ~]# ps -ef #-e显示所有进程 -f显示完整格式输出
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 04:07 ? 00:00:01 /usr/lib/systemd/systemd --
root 2 0 0 04:07 ? 00:00:00 [kthreadd]
root 3 2 0 04:07 ? 00:00:00 [ksoftirqd/0]
root 5 2 0 04:07 ? 00:00:00 [kworker/0:0H]
UID: 启动这些进程的用户
PID: 进程的 ID
PPID: 父进程的进程号
C: 进程生命周期中的 CPU 利用率
STIME: 进程启动时的系统时间
TTY: 表明进程在哪个终端设备上运行。如果显示?表示与终端无关,这种进程一般是内核态进程。另外,
tty1-tty6 是本机上面的登入者程序,若为 pts/0 等,则表示运行在虚拟终端上的进程。
TIME: 运行进程一共累计占用的 CPU 时间
CMD: 启动的程序名称
2.3 free 查看物理内存
shell
[root@localhost ~]# free -m
total used free shared buff/cache available
Mem: 972 601 155 20 215 152
Swap: 1023 33 990
第一行:
total是总内存量
used是已经使用的内存量
free是空闲的内存
shared是多个进程共享的内存总数
buffers是缓冲内存数
cached是缓存内存数。默认是KB
2.4 uptime查看系统负载
shell
[root@localhost ~]# uptime
#02:17:24 up 9:15, 4 users, load average: 0.00, 0.01, 0.05
#02:17:24 : 当前时间
#up 9:15 : 系统运行时间,说明系统运行9个小时多
#4 users : 当前登录用户数
#load average: 0.00, 0.01, 0.05 系统负载。即任务队列的平均长度。三个数值分别为
2.5 top动态管理进程
shell
[root@localhost ~]# top
top - 02:24:53 up 9:23, 4 users, load average: 0.00, 0.01, 0.05
Tasks: 211 total, 2 running, 209 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 4.0 sy, 0.0 ni, 96.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
每行信息含义如下(进程和CPU的信息 [ 第二行和第三行 ] )
Tasks: 211 total | 进程总数 |
---|---|
2 running | 正在运行的进程数 |
209 sleeping | 睡眠的进程数 |
0 stopped | 停止的进程数 |
0 zombie | 僵尸进程数 |
%Cpu(s): 0.0 us | 系统用户进程使用CPU百分比 |
4.0 sy | 内核中的进程占用CPU占比 |
0.0 ni | 用户进程空间内改变过优先级的进程占用CPU百分比 |
96.0 id | 空闲CPU百分比 |
0.0 wa | CPU等待I/O完成的时间总量 |
0.0% hi 硬中断消耗时间 | 硬中断,占用的百分比 |
0.0 si 软中断消耗时间 | 软中断,占用的CPU百分比。硬中断是由硬件设备产生,需要快速响应。软中端被用来处理可以推迟的任务(TCP协议、SCSI协议) |
0.0 st(steal 偷) | st:虚拟机偷取物理的时间。比如:物理机运行了KVM,XEM虚拟机,KVM虚拟机占用物理机的CPU时间 |
内存信息(第四五行)
shell
# KiB Mem : 995892 total, 147780 free, 617020 used, 231092 buff/cache
# KiB Swap: 1048572 total, 1014312 free, 34260 used. 150780 avail Mem
Mem : 995892 total | 物理内存总量 |
---|---|
47780 free | 空闲内存总量 |
617020 used | 使用的物理内存总量 |
231092 buff/cache | 用作内核缓存的内存量 和free返回结果相同 |
Swap: 1048572 total | 交换区总量 |
1014312 free | 空闲交换区总量 |
34260 used | 使用的交换区总量 |
150780 avail Mem | 总的可利用内存是多少 |
第七行进程信息
shell
# PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
# 17365 root 20 0 162012 2348 1600 R 4.2 0.2 0:00.13 top
# 1 root 20 0 128272 4944 2980 S 0.0 0.5 0:03.06 systemd
PID | 进程id |
---|---|
USER | 进程所有者的用户名 |
PR | 优先级(由内核动态调整),用户不能修改 表示内核看到的进程优先级 如果在该字段看到 rt ,则表示任务正在实时调度优先级下运行 |
NI | 进程优先级。nice值。负值表示高优先级,正值表示低优先级,用户可以自己调整 |
VIRT | 虚拟内存,是进程正在使用的所有内存(ps中标为VSZ) VIRT:虚拟内存 1.进程需要的虚拟内存大小,包括进程使用的库、代码、数据等 2.加入进程申请100m的内存,但实际只使用了10m,那么他会增长100m,而不是实际的使用量 |
RES | 是进程所使用的物理内存,实际使用内存(ps中标为RSS) RES:常驻内存 1.进程当前使用的内存大小,但不包括swap out 2.包含其他进程的共享 3.如果使用100m的内存,实际使用10m,只增长10m,与VIRT相反 4.关于库占用内存的情况,它只统计加载的库文件所占内存大小 |
SHR | 共享内存大小,单位kb SHR:共享内存 1.除了自身进程共享内存,也包括可能与其他进程的共享内存 2.可用的共享内存量,通常不是所有内存都驻留 3.计算某个进程所占的物理内存大小公式:RES --- SHR |
S | 进程状态 D=不可中断的睡眠状态 R=运行中国或可运行 S=睡眠中 T=已停止 Z=僵尸进程 |
%CPU | 上次更新到现在的CPU时间占用百分比 |
%MEM | 进程使用的物理内存百分比 |
TIME+ | 进程使用的CPU时间总计,单位1/100秒 |
COMMAND | 命令名/命令行 |
top快捷键
availble:可使用空间,评估有多少内存可用于启动新应用程序。
available 字段考虑了页缓存,而不是所有可回收的内存。
正因为这个原因所以通常 free+buff/cache 的数值要比 available 的数值大。
第三行为 swap 虚拟内存。
在上面信息中我们可以看到,其实系统上并没有运行什么服务。但是有 299 的 cache,这是因为在实验过程中
进行过多次读写执行等操作。这些文件会被系统暂时缓存下来,
默认三秒刷新一次,按s修改刷新时间
按空格:立即刷新
q 退出
P:按CPU排序
M:按内存排序
T:按时间排序
-p:进程IP,查看某个进程状态
-u/U:指定显示的用户
数字键1:显示每个内核的CPU使用率
h:帮助
使用lscpu命令可以查看CPU系统中CPU详细信息,并且socket字段表示物理CPU数量
2.6 fuser 根据文件或端口号找到相应进程
shell
选项
-k:默认为结束进程,也可以执行发送信号(可用信号与kill命令不同)
-i:在结束进程前会交互式确认
-u:在进程后显示进程所属用户名
-c:查看有哪些进程访问挂载点下文件
在对文件或目录执行fuser命令后会输出相应进程号,如果在进程号后出现c表示执行今晨给用户当前所在位置查询目录中。
使用 f 表示文件,但通常文件默认不显示
使用 r 表示root目录
使用 e 表示正在运行的可执行文件
fuser 22/tcp
#查看tcp协议端口有哪些进程
2.7 lsof 命令
shell
losf命令用于查看进程打开的文件,进程打开的端口(TCP、UDP)
选项:
-l条件:列出符合条件的进程,IPV4或IPV6.(4,6,协议、端口、@ip)
p<进程号>:列出指定进程号所打开的文件
设备文件名或目录:查看系统中有关设备的进程信息
#列出进程所打开的文件
lsoft -p PID
2.8 ss命令
用于查看套接字(socket)
选项:
-a:显示监听和建立连接的套接字
-t:输出TCP套接字
-u:显示UDP套接字
-n:以端口号显示(默认显示服务器名称)
-p:显示使用套接字的进程
注意:fd 文件描述符 内核用于管理已被打开的文件创建的索引 用来执行被打开的文件
三、前后台进程切换
3.1 linux后台进程与前台进程的区别
前台进程:是在终端中运行命令,命令执行过程中持续占用前台
依赖终端:那么该终端就为进程的控制终端,一旦这个终端关闭,这个进程也随之消失
后台进程:进程进入后台执行,通常不会影响当前中后续命令执行,如tar -cf等
后台运行并脱离终端:其中由一类进程也叫守护进程,是运行在后台的一种特殊进程,不受终端控制,也不需要终端的交互。Linux的大多数服务器就是用守护进程进程实现的,比如web服务器的httpd等
3.2 进程的前台与后台的命令执行
跟系统任务相关的几个命令:
命令 & | 将命令放入后台执行 |
---|---|
nohup 命令 | 将命令设置为脱离终端 |
ctrl+z | 将一个正在前台执行的命令放到后台,并且暂停 |
jobs | 查看当前有多少在后台运行的进程 |
fg 编号 | 在后台中的命令调至前台继续运行 |
bg 编号 | 将一个后台暂停的命令,变成继续执行 |
3.3 kill 关闭进程
关闭进程三个命令:
shell
kill、killall、pkill
kill 关闭进程:kill 进程号 关闭单个进程
killall和pkill命令用于杀死指定名字的进程
通过信号的方式来控制进程的
shell
kill -l #列出所有支持的信号
信号编号 | 信号名 | |
---|---|---|
1) | SIGHUP | 重新加载配置 |
2) | SIGINT | 键盘中断 |
3) | SIGQUIT | 退出 |
9) | SIGKILL | 强制终止 |
15) | SIGTERM | 终止(正常结束)缺省信号 |
18) | SIGCONT | 继续 |
19) | SIGSTOP | 停止 |
20) | SIGTSTP | 暂停 ctrl+z |
3.3.1 kill命令
shell
[root@localhost ~]# ps -aux | grep "sshd"
root 15386 0.3 0.5 160848 5552 ? Ss 00:08 0:00 sshd: xxhf [priv]
xxhf 15400 0.0 0.2 160848 2380 ? S 00:08 0:00 sshd: xxhf@pts/4
root 15447 0.0 0.0 112724 984 pts/2 R+ 00:08 0:00 grep --color=auto sshd
[root@localhost ~]# kill -2 15386
[root@localhost ~]# ps -aux | grep "sshd"
3.3.2 killall命令
killall [子选项] [信号] 进程名
shell
选项:
-i:交互式,询问是否要杀死某个进程
#父进程结束,子进程不可能结束,子进程的父进程会变成之前父进程的父进程
[root@localhost ~]# killall -i sshd 交互式杀死sshd进程
3.3.3 pkill命令
shell
跟killall相似,也是按照进程名来杀死进程
killall [子选项] [信号] 进程名
选项:
-t:端口号:按照终端号踢出用户
四、进程的优先级管理
优先级取值范围为(-20,19)值越小优先级越高,默认优先级是0
shell
#nice -n 指定程序的运行优先级
[root@localhost yang]# nice -n -5 vim /etc/fstab
[root@localhost ~]# ps aux | grep vim
[root@localhost ~]# top -p 16471
#renice 改变程序的运行优先级
[root@localhost yang]# renice +5 3103
3103 (进程 ID) 旧优先级为 0,新优先级为 5
五、screen概念
Screen有会话的概念,用户可以在一个screen会话中创建多个screen窗口,在每一个screen窗口中就像操作一个真实的telent、SSH连接窗口那样
shell
#新建一个test会话
screen -S test
#列出所有当前会话
screen -ls
#回到test会话
screen -r test
### 五、screen概念
Screen有会话的概念,用户可以在一个screen会话中创建多个screen窗口,在每一个screen窗口中就像操作一个真实的telent、SSH连接窗口那样
```shell
#新建一个test会话
screen -S test
#列出所有当前会话
screen -ls
#回到test会话
screen -r test