进程管理
一、进程的基本简介
1.1程序、进程与线程
1.1.1简介
程序:是一组指令及参数的集合,按照既定的逻辑控制计算机运行来完成特定的任务。
进程:是运行着的程序,是操作系统执行的基本单位,是程序运行的过程、动态、有生命周期及运行状态。进程的生命周期:因创建而产生、因调度而运行、因等待资源或事件而处于等待状态,因完成任务而被撤销。
线程:是进程的一个实体,是cpu调度和分派的基本单位,它是比进程更小的能独立运行的基本单位,一个线程可以创建和撤销另一个线程。
1.2三者之间的联系与区别
1.2.1程序与进程
- 一个运行的程序至少有一个进程,一个进程至少有一个线程。
- 程序与进程是一对多的关系,程序在不同的数据集上运行就成为不同的进程。
- 进程具有并发性和交往性,程序具有封闭性。
- 进程反应了一个程序在一定的数据集上运行的全部动态过程。
1.2.2线程和进程
- 一个进程至少有一个线程。
- 线程不能单独运行,但每一个线程都有程序的入口、执行序列以及程序的出口,它必须组成进程才能被执行。
1.3父进程和子进程
父进程:在计算机领域,父进程(英语:Parent Process)指已创建一个或多个子进程的进程。
子进程:在计算机领域中,子进程为由另外一个进程(对应称之为父进程)所创建的进程。
1.3.1两者之间的关系
- 一个进程可能下属多个子进程,但最多只能有1个父进程。
- 若某一进程没有父进程,则可知该进程很可能由内核直接生成。
- 进程ID为1的进程是在系统引导阶段由内核直接创建的,且不会在系统运行过程中终止执行。
- 在父进程被杀死之后子进程也会随之被杀死。
- 子进程会继承父进程的安全性身份、过去和当前的文件描述符、端口和资源特权、环境变量、以及程序代码。
二、进程前后台与状态
2.1前台进程和后台进程
2.1.1简介
前台进程:是在终端中运行的命令,那么该终端就为进程的控制终端,一旦这个终端关闭,这个进程也随之消失。
后台进程:也叫守护进程(Daemon),是运行在后台的一种特殊进程,不受终端控制,它不需要终端的交互;Linux的大多数服务器就是使用守护进程实现的。比如Web服务器的httpd等。
2.2进程状态
进程状态:由操作系统定义,并由操作系统所操控的一个特殊的数据结构实例叫做进程。它连接了用户代码,拥有代码运行所需的独立内存空间,在调度器的调度下使用分配给它的处理器时间片来运行。
状态名 | 状态意义 |
---|---|
R | 可执行状态 |
S | 可中断睡眠状态 |
D | 不可中断的睡眠状态 |
T | 暂停状态 |
t | 跟踪状态 |
Z | 退出状态(僵尸状态) |
X | 退出状态,进程即将被销毁 |
2.3进程优先级
2.3.1Linux进程调度及多任务
每个cpu(或cpu核心)在一个时间点上只能处理一个进程,通过时间片技术,Linux实际能够运行的进程和线程数可以超出实际可用的cpu及核心数量。Linux内核进程调度程序将多个进程在cpu核上快速切换,从而给用户多个进程在同时运行的印象。
2.3.2相对优先级nice
因为不是每个进程都与其他进程同样重要,可告知进程调度程序为不同进程使用不同的调度策略。常规系统上的大多数进程所使用的调度策略SCHED_OTHER(也称为SCHED_NORMAL),但还要其他的一些调度策略用于不同的目的。SCHED_OTIME调度策略运行的进程的相对优先级为进程的nice之,可以有四十多种不同的nice值级别。(从-20到19)
nice值越高:表示优先级越低,如+19表示该进程容易将cpu使用量让给其他进程。
nice值越低:表示优先级越高,如-20,该进程不倾向让出cpu。
2.4查看进程的nice级别
2.4.1使用top查看nice级别
NI:实际nice级别
PR:将nice级别显示为映射到更大优先级队列,-20映射到0,+19映射到39。
2.4.2使用ps查看nice级别
三、Linux进程管理工具
3.1 pstree命令
3.1.1pstree命令的作用
pstree 命令是以树形结构显示程序和进程之间的关系,可以清晰的看出那个是父进程那个是子进程。
注意:在使用 pstree 命令时,如果不指定进程的 PID 号,也不指定用户名称,则会以 systemd 进程为根进程,显示系统中所有程序和进程的信息.
[root@guowangzhongwen ~]# pstree
systemd─┬─ModemManager───2*[{ModemManager}]
├─NetworkManager───2*[{NetworkManager}]
├─VGAuthService
├─abrt-dbus───3*[{abrt-dbus}]
├─2*[abrt-watch-log]
├─abrtd
├─accounts-daemon───2*[{accounts-daemon}]
├─alsactl
├─at-spi-bus-laun─┬─dbus-daemon───{dbus-daemon}
│ └─3*[{at-spi-bus-laun}]
├─at-spi2-registr───2*[{at-spi2-registr}]
├─atd
├─auditd─┬─audispd─┬─sedispatch
│ │ └─{audispd}
│ └─{auditd}
注意:若指定 PID 号或用户名,则将以 PID 或指定命令为根进程,显示 PID 或用户对应的所有程序和进程。
[root@guowangzhongwen ~]# pstree 7166
gnome-session-b─┬─gnome-shell─┬─ibus-daemon─┬─ibus-dconf───3*[{ibus-dconf}]
│ │ ├─ibus-engine-sim───2*[{ibus-engine-sim}]
│ │ └─2*[{ibus-daemon}]
│ └─20*[{gnome-shell}]
3.1.2pstree命令的参数
选项 | 含义 |
---|---|
-A | 各进程数之间的连接以ASCII码字符链接 |
-U | 各进程树之间的连接以utf8字符来连接 |
-p | 同时列出每个进程的PID |
-u | 同时列出每个进程的所属账号名称 |
3.1.3pstree命令的例子
- 显示进程号为7166的所有子进程以及进程PID
[root@guowangzhongwen ~]# pstree -p 7166
gnome-session-b(7166)─┬─gnome-shell(7217)─┬─ibus-daemon(7270)─┬─ibus-dconf(7273)─┬─{ibus-dconf}(7274)
│ │ │ ├─{ibus-dconf}(7279)
│ │ │ └─{ibus-dconf}(7282)
│ │ ├─ibus-engine-sim(7429)─┬─{ibus-engine-sim}(7431)
│ │ │ └─{ibus-engine-sim}(7432)
│ │ ├─{ibus-daemon}(7271)
│ │ └─{ibus-daemon}(7277)
│ ├─{gnome-shell}(7220)
│ ├─{gnome-shell}(7221)
│ ├─{gnome-shell}(7222)
│ ├─{gnome-shell}(7237)
- 显示进程号为7166的所有子进程以及对应用户的名称
[root@guowangzhongwen ~]# pstree 7166
gnome-session-b─┬─gnome-shell─┬─ibus-daemon─┬─ibus-dconf───3*[{ibus-dconf}]
│ │ ├─ibus-engine-sim───2*[{ibus-engine-sim}]
│ │ └─2*[{ibus-daemon}]
│ └─20*[{gnome-shell}]
├─gsd-a11y-settin───3*[{gsd-a11y-settin}]
├─gsd-clipboard───2*[{gsd-clipboard}]
├─gsd-color───3*[{gsd-color}]
├─gsd-datetime───2*[{gsd-datetime}]
3.2 pgrep 命令
3.2.1pgrep命令的作用
根据给定的条件查找正在运行的程序的进程ID。 它可以是完整或部分的进程名称,运行该进程的用户或其他属性。
**语法格式:**pgrep [OPTIONS]
注意:当不带任何选项运行时,pgrep显示匹配所给名字的所有运行程序 PID。
[root@guowangzhongwen ~]# pgrep sshd
6720
6751
7459
3.2.2pgrep命令的参数
选项 | 作用 |
---|---|
-d | 允许你指定一个分隔符 |
-l | 显示名称和id |
-f | 将会匹配所有的参数列表 |
-u | 显示所有给用户运行的进程 |
-n | 当匹配多个进程时显示进程号最大的那个 |
-o | 当匹配多个进程时显示进程号最小的那个 |
-v | 反向匹配 |
3.2.3pgrep命令的例子
- 同时显示进程PID和进程名称
[root@guowangzhongwen ~]# pgrep -l sshd
6720 sshd
6751 sshd
7459 sshd
- 当匹配多项进程时显示进程号最小的那个
[root@guowangzhongwen ~]# pgrep -o sshd
6720
- 当匹配多项进程是显示进程号最大的那个
[root@guowangzhongwen ~]# pgrep -n sshd
7459
3.3ps命令
3.3.1PS命令的作用
ps全名:process status 过程状态
ps命令用于显示当前进程的状态
语法 ps 【options’】 【–help】
3.3.2ps命令的参数
选项 | 作用 |
---|---|
-A | 列出所有进程 |
-a | 显示现在终端机下的所有进程,包括其他用户进程 |
-u | 以用户为主的进程状态 |
-x | 通常与a参数一块使用可以列出较完整信息 |
-f | 做一个更完整的输出 |
-e | 列出所有进程 |
-i | 较长、较详细的将该PID的信息列出 |
3.3.3ps命令的例子
- ps -aux(显示包含其他使用着的进程)
[root@guowangzhongwen ~]# ps -aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 193812 6872 ? Ss 14:38 0:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0.0 0.0 0 0 ? S 14:38 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 14:38 0:00 [ksoftirqd/0]
root 5 0.0 0.0 0 0 ? S< 14:38 0:00 [kworker/0:0H]
root 7 0.0 0.0 0 0 ? S 14:38 0:00 [migration/0]
root 8 0.0 0.0 0 0 ? S 14:38 0:00 [rcu_bh]
- ps -ef(显示所有进程信息,连同命令行)
[root@guowangzhongwen ~]# ps -ef
UID PID PPID C STIME TTY TIME CMD
root 1 0 0 14:38 ? 00:00:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0 0 14:38 ? 00:00:00 [kthreadd]
root 3 2 0 14:38 ? 00:00:00 [ksoftirqd/0]
root 5 2 0 14:38 ? 00:00:00 [kworker/0:0H]
3.3.4ps命令的表头信息
- USER: 行程拥有者
- PID: pid
- %CPU: 占用的 CPU 使用率
- %MEM: 占用的物理内存使用率
- VSZ: 占用的虚拟内存大小
- RSS: 占用的物理内存大小
- TTY: 终端的次要装置号码 (minor device number of tty)
- STAT: 该行程的状态:
- D: 无法中断的休眠状态 (通常 IO 的进程)
- R: 正在执行中
- S: 静止状态
- T: 暂停执行
- Z: 不存在但暂时无法消除
- W: 没有足够的记忆体分页可分配
- <: 高优先序的行程
- N: 低优先序的行程
- L: 有记忆体分页分配并锁在记忆体内 (实时系统或捱A I/O)
- START: 行程开始时间
- TIME: 执行的时间
- COMMAND:所执行的指令
3.4kill命令
3.4.1kill命令的作用
**kill命令的作用:**kill 是向进程发送信号的命令。默认传递终止进程运行的信号进程。多用于终止后台进程。
3.4.2kill命令的参数
使用kill -l命令列出所有可用的信号
[root@guowangzhongwen ~]# kill -l
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 5) SIGTRAP
6) SIGABRT 7) SIGBUS 8) SIGFPE 9) SIGKILL 10) SIGUSR1
11) SIGSEGV 12) SIGUSR2 13) SIGPIPE 14) SIGALRM 15) SIGTERM
16) SIGSTKFLT 17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 25) SIGXFSZ
26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 29) SIGIO 30) SIGPWR
31) SIGSYS 34) SIGRTMIN 35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3
38) SIGRTMIN+4 39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7
58) SIGRTMAX-6 59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2
63) SIGRTMAX-1 64) SIGRTMAX
最长使用的信号是1、9、15
kill 1:重新加载进程
kil 9:彻底杀死进程
kill 15:完美的停止一个进程 也是kill不带参数默认的进程
参数 | 作用 |
---|---|
-l | 列出全部信号名称 |
-a | 处理当前进程时,不限制命名名和进程号的对应关系 |
-u | 指定用户 |
3.5pkill命令
3.5.1pkill命令的作用
pkill 命令和 killall 命令的用法相同,都是通过进程名杀死一类进程,除此之外,pkill 还有一个更重要的功能,即按照终端号来踢出用户登录。
参数与pgrep参数相同
3.6killall命令
3.6.1kill all命令的作用
用于杀死进程,与 kill 不同的是killall 会杀死指定名字的所有进程。kill 命令杀死指定进程 PID,需要配合 ps 使用,而 killall 直接对进程对名字进行操作,更加方便。
3.6.2killall命令的参数
选项 | 作用 |
---|---|
-e | 要求匹配进程名称 |
-I | 忽略小写 |
-g | 杀死进程组 |
-w | 等待进程死亡 |
3.7top命令
3.7.1top命令的作用
top命令用于实时显示 process 的动态
语法:top 【选项】
3.7.2top命令的参数
选项 | 作用 |
---|---|
-d | 秒数:指定top命令每隔几秒更新,默认是三秒 |
-p | 进程pid,仅查看指定pid的进程 |
-s | 使top命令在安全模式中运行 |
-u | 用户名,只监听某个用户的进程 |
3.7.3top命令的快捷键
- ? 或 h:显示交互模式的帮助;
- P:按照 CPU 的使用率排序,默认就是此选项;
- M:按照内存的使用率排序;
- N:按照 PID 排序;
- T:按照 CPU 的累积运算时间排序,也就是按照 TIME+ 项排序;
- k:按照 PID 给予某个进程一个信号。一般用于中止某个进程,信号 9 是强制中止的信号;
- r:按照 PID 给某个进程重设优先级(Nice)值;
- q:退出 top 命令;
3.7.4top命令表头的含义
前五行信息统计:
第一行是任务列队信息:
信息 | 详解 |
---|---|
14:43:13 | 当前时间 |
up 18 min | 系统运行时间 |
3 user | 当前登录用户数 |
load average:0.01,0.02,0.05 | 系统负载,即任务队列的平均长度。三个数值分别表示1分钟,5分钟,15分到现在的平均值 |
第二、三行为进程和CPU信息:
信息 | 详解 |
---|---|
213 total | 进程总数为213 |
running | 正在运行的经常数 |
sleeping | 睡眠的进程数 |
stopped | 停止的进程数 |
zombie | 僵尸进程数 |
us | 用户空间占用CPU百分比 |
sy | 内核空间占用CPU百分比 |
ni | 用户进程空间内改变过优先级的进程占用CPU百分比 |
id | 空闲CPU百分比 |
wa | 等待输入输出的CPU时间百分比 |
hi | 硬中断占用CPU的百分比 |
si | 软中断占用CPU的百分比 |
st | 是当hypervisor服务另一个虚拟处理器的时候,虚拟CPU等待实际CPU的百分比 |
最后两行为内存信息
信息 | 详解 |
---|---|
totall | 物理内在总量 |
used | 使用的物理内存总量 |
free | 空闲内存总量 |
buffers | 用作内核缓存的内存量 |
total | 交换区总量 |
used | 使用交换区的总量 |
free | 空闲区总量 |
cached | 缓冲交换区的总量 |
信息区的信息:
信息 | 详解 |
---|---|
PID | 进程ID |
USER | 进程所用着用户名 |
PR | 优先级 |
NI | nice值。复制表示优先级高 |
VIRT | 进程使用虚拟内存总量 |
RES | 进程使用的未被唤出的物理内存大小 |
SHR | 共享内存大小 |
S | 进程状态 |
%CPU | CPU的占有率 |
%MEM | 进程使用物理内存百分比 |
TIME+ | 进程使用CPU的时间总计 |
COMMAND | 命令名 |
RES | 进程使用的未被唤出的物理内存大小 |
SHR | 共享内存大小 |
S | 进程状态 |
%CPU | CPU的占有率 |
%MEM | 进程使用物理内存百分比 |
TIME+ | 进程使用CPU的时间总计 |
COMMAND | 命令名 |
3.8htop命令
3.8.1htop命令的作用
top 类似于 top 命令,但可以让你在垂直和水平方向上滚动,所以你可以看到系统上运行的所有进程,以及他们完整的命令行。可以不用输入进程的 PID 就可以对此进程进行相关的操作 (killing, renicing)。 htop 是 Linux 系统中的一个互动的进程查看器
- 可以横向或纵向滚动浏览进程列表,以便看到所有的进程和完整的命令行。
- 在启动上,比top 更快。
- 杀进程时不需要输入进程号。
- htop 支持鼠标操作。
- top 已经很老了。
注意:如果配置的镜像源没有epel仓库,则不能直接使用yum 直接安装htop。
3.8.2htop命令的安装
- 先配置镜像仓库
[root@guowangzhongwen yum.repos.d]# wget -O /etc/yum.repos.d/epel.repo https://mirrors.aliyun.com/repo/epel-7.repo
[root@guowangzhongwen yum.repos.d]# yum clean all
[root@guowangzhongwen yum.repos.d]# yum makecache
- 使用yum -y install htop下载配置htop
[root@guowangzhongwen yum.repos.d]# yum install htop -y
- 打开htop
3.8.3htop命令的参数
选项 | 作用 |
---|---|
-c | 使用单一配色方案 |
-d | 设置延迟跟新时间,单位秒 |
-u | 只显示一个给定用户的过程 |
-p | 只显示给定PID的过程 |
-s | 以此来排序(后面接排序内容) |
-v | 显示版本信息 |
3.8.4htop命令的四个区
第一区域:CPU、内存、Swap的使用情况
第二区域:任务、线程、平均负载及系统运行时间的信息。平均负载部分提供了三个数字,这仅仅表示的是过去的5分钟、10分钟和15分钟系统的平均负载而已,在单核的系统中平均负载为1表示的是百分之百的 CPU 利用率。最后,运行时间 (uptime)标示的数字是从系统启动起到当前的运行总时间。
第三区域:当前系统中的所有进程。各列说明:
- PID:进程标志号,是非零正整数
- USER:进程所有者的用户名
- PR:进程的优先级别
- NI:进程的优先级别数值
- VIRT:进程占用的虚拟内存值
- RES:进程占用的物理内存值
- SHR:进程使用的共享内存值
- S:进程的状态,其中S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值是负数
- %CPU:该进程占用的CPU使用率
- %MEM:该进程占用的物理内存和总内存的百分比
- TIME+:该进程启动后占用的总的CPU时间
- COMMAND:进程启动的启动命令名称
第四区域:当前界面中F1-F10功能键中定义的快捷功能。即 底部菜单栏。
3.8.5htop命令的F1到F10用法
键位 | 作用 |
---|---|
F1 | 查看htop使用说明 |
F2 | htop设定 |
F3 | 搜索进程 |
F4 | 增量进程过滤器 |
F5 | 显示树形结构 |
F6 | 选择排序方式 |
F7 | 可减少nice值可提高对应进程的优先级 |
F8 | 可增加nice值,降低进程的优先级 |
F9 | 可对进程传递信号 |
F10 | 结束htop |
3.8.6htop命令的快捷键
M 按照 内存使用百分比 排序, 对应 MEM%列;
P 按照 CPU使用百分比 排序,对应 CPU%列;
T 按照 进程运行的时间 排序,对应TIME+列;
F 跟踪进程: 如果排序顺序引起选定的进程在列表上到处移动,让选定条跟随该进程。
# 快速定位光标到PID所指定的进程上。
Ctrl + L 刷新
Numbers PID 查找:
L显示进程打开文件
l倒转排序顺序
3.9vmstat命令
3.9.1vmstat命令的用法
vmstat主要是用来检测虚拟内存的,可以展现给定时间间隔的服务器的状态值,包括CPU使用率,内存使用率,虚拟内存交换情况,IO读写情况等。
3.9.2vmstat命令的参数
参数 | 作用 |
---|---|
-v | 显示版本信息 |
-n | 只在开始时显示一次各字段名称 |
-a | 显示活跃和非活跃内存 |
-d | 显示各个磁盘相关统计信息 |
-D | 显示磁盘总统信息 |
-p | 显示指定磁盘分区统计信息 |
-s | 显示内存相关统计信息以及多种系统活动数量 |
delay | 刷新时间间隔 |
count | 刷新次数 |
3.9.3vmstat命令字段含义
procs区:
信息 | 含义 |
---|---|
r | 等待运行的进程数 |
b | 处在非中断睡眠状态的进程数 |
w | 被交换出去可运行的进程数 |
Memory区:
信息 | 含义 |
---|---|
spwd | 虚拟内存的使用情况 |
free | 空闲的内存 |
buff | 被用来作为缓存的内存数 |
swap区:
信息 | 含义 |
---|---|
si | 从磁盘的交换到内存的交换页的数量 |
so | 从内存的交换到磁盘的交换页的数量 |
IO区:
信息 | 含义 |
---|---|
bi | 发送到块设备的块数 |
bo | 从快设备接受到的块数 |
system区:
信息 | 含义 |
---|---|
in | 每秒的中断数,包括时钟中断 |
cs | 每秒的环境切换次数 |
cpu区:
信息 | 含义 |
---|---|
us | cpu使用时间 |
sy | cpu系统使用时间 |
id | 闲置时间 |
3.10lsof命令
3.10.1lsof命令的作用
列出当前系统打开文件的工具。
lsof输出信息含义:在终端下输入lsof即可显示系统打开的文件,因为lsof需要访问核心内存的各种文件,所有必须以root的身份运行他才能充分的发挥其作用。
3.10.2lsof命令的参数
选项 | 作用 |
---|---|
-a | 列出打开文存在的进程 |
-c<进程名> | 列出指定进程所打开的文件 |
-g | 列出GID号进程详情 |
-d<文件号> | 列出占用该文件号的进程 |
+d<目录> | 列出目录下被打开的文件 |
+D<目录> | 递归列出目录下被打开的文件 |
-n<目录> | 列出使用NFC的文件 |
-l | 在输出显示用户ID而不是用户名 |
-i<条件> | 列出符合条件的进程 |
-p<进程号> | 列出指定进程号所打开的文件 |
|
| sy | cpu系统使用时间 |
| id | 闲置时间 |
3.10lsof命令
3.10.1lsof命令的作用
列出当前系统打开文件的工具。
lsof输出信息含义:在终端下输入lsof即可显示系统打开的文件,因为lsof需要访问核心内存的各种文件,所有必须以root的身份运行他才能充分的发挥其作用。
3.10.2lsof命令的参数
选项 | 作用 |
---|---|
-a | 列出打开文存在的进程 |
-c<进程名> | 列出指定进程所打开的文件 |
-g | 列出GID号进程详情 |
-d<文件号> | 列出占用该文件号的进程 |
+d<目录> | 列出目录下被打开的文件 |
+D<目录> | 递归列出目录下被打开的文件 |
-n<目录> | 列出使用NFC的文件 |
-l | 在输出显示用户ID而不是用户名 |
-i<条件> | 列出符合条件的进程 |
-p<进程号> | 列出指定进程号所打开的文件 |