一、进程管理
### --- 进程简介
### --- 什么是进程管理?
~~~ 那么到底什么是进程呢?
~~~ #进程是正在执行的一个程序或命令,每一个进程都是一个运行的实体,
~~~ #都有#自己的地址空间,并占用一定的系统资源。
~~~ 那么什么是程序呢?
~~~ 程序是人使用计算机语言编写的可以实现特定目标或解决特定问题的代码集合。
~~~ 这么讲很难理解,
~~~ 那我们换一种说法:#程序是人使用计算机语言编写的,
~~~ #可以实现一定功能,并且可以执行的代码集合。
~~~ 进程是正在执行当中的程序。
~~~ 程序被执行时,执行人的权限和属性、以及程序的代码都会被加载如内存,
~~~ 操作系统给这个进程分配一个 ID 号,我们成为 PID(进程 ID)。
### --- 进程管理的作用
### --- 判断服务器健康状态:
~~~ 运维工程师最主要的工作就是保证服务器安全稳定的运行。
~~~ 理想的状态是,在服务器出现问题,但是还没有造成服务器宕机或停止服务时,
~~~ 就人为干预解决了问题。进程管理最主要的工作就是判断服务器当前运行是否健康,
~~~ 是否需要人为干预。如果服务器的 CPU 占用率、内存占用率过高,就需要人为介入解决问题了。
### --- 查看系统中所有的进程:
~~~ 我们需要查看系统中所有正在运行的进程,
~~~ 通过这些进程可以判断系统中运行了哪些服务,是否有非法服务运行。
### --- 杀死进程:
~~~ 这是进程管理中最不常用的手段,当我需要停止服务时,
~~~ 会通过正确关闭命令来停止服务(如 apache 服务可以通过 service httpd stop 来关闭)。
~~~ 只有当正确终止进程的手段失效的情况下,
~~~ 才会考虑使用 kill 命令杀死进程(你不是杀手,
~~~ 不要什么进程都用 kill来终止,否则非常容易导致服务器崩溃)。
~~~ 注:内存状态不超过70%,CPU状态占比不超过90%,就是合理的。没有死机风险。
~~~ 理论上服务器越接近这个值,说明资源利用最大化;但是也需要承担宕机风险。
~~~ 所以需要控制在这个值之下
一、进程的查看:ps 命令
### --- ps 命令
~~~ ps 命令是用来静态显示系统中进程的命令。不过这个命令有些特殊,
~~~ 它的部分命令的选项不能加入“-”,比如命令“ps aux”,其中“aux”是选项,
~~~ 但是这个选项不能加入“-”。这是因为 ps命令的部分选项需要遵守 BSD 操作系统的格式。
~~~ 所以 ps 命令的常用选项的组合是固定的。命令如下:
~~~ 查看系统中所有进程,使用 BSD 操作系统格式
[root@server11 ~]# ps -aux // 加入-会有一行报错,但是不影响执行结果。
Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.8/FAQ
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.2 125616 4192 ? Ss 15:25 0:02 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0.0 0.0 0 0 ? S 15:25 0:00 [kthreadd]
root 3 0.0 0.0 0 0 ? S 15:25 0:00 [ksoftirqd/0]
~~~ 查看系统中所有进程,使用 Linux 标准命令格式。
[root@server11 ~]# ps -le
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1 0 0 80 0 - 31404 ep_pol ? 00:00:02 systemd
1 S 0 2 0 0 80 0 - 0 kthrea ? 00:00:00 kthreadd
1 S 0 3 2 0 80 0 - 0 smpboo ? 00:00:00 ksoftirqd/0
### --- 查看系统中所有的进程
~~~ 选项:
~~~ a:显示一个终端的所有进程,除了会话引线
~~~ u:显示进程的归属用户及内存的使用情况
~~~ x:显示没有控制终端的进程
~~~ -l:长格式显示。显示更加详细的信息
~~~ -e:显示所有进程,和-A 作用一致
~~~ 程序名及软件名,是给用户来看的,而系统正真识别的是程序的ID号。抓取的是当前回车的系统运行状态,而不会是动态状态。
[root@localhost ~]# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.2 2872 1416 ? Ss Jun04 0:02 /sbin/init
root 2 0.0 0.0 0 0 ? S Jun04 0:00 [kthreadd]
root 13316 0.0 0.1 157408 1912 pts/1 R+ 18:25 0:00 ps -aux // 这条命令自己运行的进程
### --- 解释下这个命令的输出:
~~~ USER:该进程是由哪个用户产生的;
~~~ PID:进程的 ID 号;
~~~ %CPU:该进程占用 CPU 资源的百分比,占用越高,进程越耗费资源;
~~~ %MEM:该进程占用物理内存的百分比,占用越高,进程越耗费资源;
~~~ VSZ:该进程占用虚拟内存的大小,单位 KB;
~~~ RSS:该进程占用实际物理内存的大小,单位 KB;
~~~ TTY:该进程是在哪个终端中运行的。其中 tty1-tty7 代表本地控制台终端(可以通过
~~~ alt+F1-F7 键切换不同的终端),tty1-tty6 是本地的字符界面终端,tty7 是图形终端。
~~~ pts/0-255 代表虚拟终端,一般是远程连接的终端,第一个远程连接占用的是 pts/0 终端,第二个远程连接占用 pts/1,依次增长。
~~~ STAT:进程状态。常见的状态有:
~~~ D:不可被唤醒的睡眠状态,通常用于 I/O 情况
~~~ R:该进程正在运行
~~~ S:该进程在睡眠状态,可被唤醒
~~~ T:停止状态,可能是在后台暂停或进程在除错状态
~~~ W:内存交互状态(从 2.6 内核开始无效)
~~~ X:死掉的进程(应该不会出现)
~~~ Z:僵尸进程。进程已经终止,但是部分程序还在内存当中。
~~~ <:高优先级(以下状态在 BSD 格式当中出现)
~~~ N:低优先级
~~~ L:被锁入内存
~~~ s:包含子进程
~~~ l:多线程(小写 L)
~~~ +:位于后台
~~~ START:该进程的启动时间
~~~ TIME:该进程占用 CPU 的运算时间,注意不是系统时间;时间越长,表示越消耗资源。
~~~ COMMAND:产生此进程的命令名
[root@localhost ~]# ps -le
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY
TIME CMD
4 S 0 1 0 0 80 0 - 718 - ? 00:00:02 init
1 S 0 2 0 0 80 0 - 0 - ? 00:00:00 kthreadd
0 R 0 13333 13209 0 80 0 - 38300 - pts/1 00:00:00 ps // ps自己执行的进程
### --- 也来解释下这个命令的输出:
~~~ F:进程标志,说明进程的权限,常见的标志有:
~~~ 1:进程可以复制,但是不能执行
~~~ 4:进程使用超级用户权限
~~~ S:进程状态。具体的状态和“ps aux”命令中 STAT 状态一致
~~~ UID:进程是哪个 UID 用户调用运行的
~~~ PID:进程的 ID 号
~~~ PPID:父进程的 ID 号
~~~ C:该进程的 CPU 使用率,单位是百分比
~~~ PRI:进程的优先级,数值越小该进程优先级越高,越快被 CPU 执行~~~ NI:进程的优先级,也是数值越小越早被执行
~~~ ADDR:该进程在内存的哪个位置
~~~ SZ:该进程占用多大内存
~~~ WCHAN:该进程是否运行。“-”代表正在运行
~~~ TTY:该进程由哪个终端产生
~~~ TIME:该进程占用 CPU 的运算时间,注意不是系统时间
~~~ CMD:产生此进程的命令名
二、进程的查看:top 命令
### --- top 命令
[root@localhost ~]# top [选项]
### --- 选项:
~~~ -d 秒数: 指定 top 命令每隔几秒更新。默认是 3 秒
~~~ -b: 使用批处理模式输出。一般和“-n”选项合用,用于把 top 命令重定向到文件中
~~~ -n 次数: 指定 top 命令执行的次数。一般和“-b”选项合用
~~~ -p: 指定 PID。只查看某个 PID 的进程
~~~ -s: 使 top 在安全模式运行,避免在交互模式中出现错误
~~~ -u 用户名: 只监听某个用户的进程在 top 命令的交互模式当中可以执行的命令:
~~~ ?或 h: 显示交互模式的帮助
~~~ P: 以 CPU 使用率排序,默认就是此项
~~~ M: 以内存的使用率排序
~~~ N: 以 PID 排序
~~~ T: 按照 CPU 的累积运算时间排序,也就是用 TIME+项排序
~~~ k: 按照 PID 号,给予某个进程一个信号。一般用于终止某个进程,信号 9是强制终止的信号
~~~ r: 按照 PID 号,给某个进程重设优先级(Nice)值
~~~ q: 退出 top
### --- 我们看看 top 命令的执行结果:
~~~ 我们解释下命令的输出,top 命令的输出内容是动态的,默认每 3 秒刷新一次。
### --- 命令的输出主要分为两大部分:
~~~ 第一部分是前五行,显示的是整个系统的资源使用状况,
~~~ 我们就是通过这些输出判断服务器的健康状态;
~~~ 第二部分从第六行开始,显示的是系统中进程的信息。
[root@server11 ~]# top
top - 17:01:00 up 1:35, 3 users, load average: 0.08, 0.03, 0.05
~~~ 登录时间 当前登录用户数 平均压力值1分钟,5分钟,15分钟
Tasks: 124 total, 1 running, 123 sleeping, 0 stopped, 0 zombie
%Cpu(s): 3.0 us, 3.0 sy, 0.0 ni, 93.9 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
~~~ CPU运行:3%被用户占用;3%被系统占用;0%是被修改过优先级进程占用 93.9%是空闲的,通过它来判断CPU空闲率
KiB Mem : 1865308 total, 1136648 free, 191400 used, 537260 buff/cache
~~~ 内存占用
KiB Swap: 4194300 total, 4194300 free, 0 used. 1459696 avail Mem
~~~ swap占用:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
~~~ 显示出的系统进程的信息
1 root 20 0 125616 4192 2620 S 0.0 0.2 0:02.10 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.01 kthreadd
~~~ 第一行:load average: 0.08, 0.03, 0.05 // 之前的压力
~~~ 第三行:93.9 id // CPU的空闲压力
~~~ 第四行:内存占用:1136648 free // 内存和swap的空闲
~~~ 第五行:swap占用:4194300 free // 通过以上判断主机压力
### --- top的交互选项:
~~~ ?号查看支持的交互选项查看
~~~ P按照CPU来排序:默认是该项
~~~ M以内存的使用率排序
~~~ N以PID排序
~~~ TCPU的累计运算时间排序
~~~ r按照PID号,给与某一个进程信号
### --- top的命令选项
### --- 查看某一个进程的状态信息
### --- 查看httpd的进程ID
[root@server11 ~]# ps -aux |grep httpd
root 14944 0.2 0.2 230392 5184 ? Ss 21:03 0:00 /usr/sbin/httpd -DFOREGROUND
[root@server11 ~]# ps -l 14944
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 14944 1 0 80 0 - 57598 poll_s ? 0:00 /usr/sbin/httpd -DFOREGROUND
### --- 把top的结果保存在文件里,并查看
~~~ kill键直接可以杀死进程
[root@server11 ~]# top -b -n 1 > /root/top.log
[root@server11 ~]# cat top.log
我们先来说明第一部分的作用:第一行信息为任务队列信息具体内容如表 15-1 所示:表 15-1 任务队列信息
内容 | 说明 |
12:26:46 | 系统当前时间 |
up 1 day 13:32 | 系统的运行时间,本机已经运行 1 天 13 小时 32分钟 |
2 users | 当前登录了两个用户 |
load average: 0.00, 0.00, 0.00 | 系统在之前 1 分钟,5 分钟,15 分钟的平均负载。 如果 CPU 是单核,则这个数超过 1,就是高负载。 如果 CPU 是四核,则这个数超过 4,就是高负载。 (这个平均负载完全是个人经验来进行判断的, 一般认为不应该超过服务器 CPU 的核数。) |
第二行为进程信息,具体内容如表 15-2 所示:表 15-3 CPU 信息
说明 | |
Cpu(s): 0.1%us | 用户模式占用的 CPU 百分比 |
0.1%sy | 系统模式占用的 CPU 百分比 |
0.0%ni | 改变过优先级的用户进程占用的 CPU 百分比 |
99.7%id | 空闲 CPU 的 CPU 百分比 |
0.1%wa | 等待输入/输出的进程的占用 CPU 百分比 |
0.0%hi | 硬中断请求服务占用的 CPU 百分比 |
0.1%si | 软中断请求服务占用的 CPU 百分比 |
0.0%st | st(Steal time)虚拟时间百分比。就是当有 虚拟机时,虚拟 CPU 等待实际 CPU 的时间百分比 |
第四行为物理内存信息,具体内容如表 15-4 所示:表 15-4 物理内存信息
内容 | 说明 |
Mem: 625344k total | 物理内存的总量,单位 KB |
571504k used | 已经使用的物理内存数量 |
53840k free | 空闲的物理内存数量,我们使用的是虚拟机,总共只分配了 628MB 内存,所以只有 53MB 的空闲内存了 |
65800k buffers | 作为缓冲的内存数量 |
第五行为交换分区(swap)信息:表 15-5 交互分区信息
说明 | |
Swap:524280k total | 交换分区(虚拟内存)的总大小 |
OK used | 已经使用的额交换分区的大小 |
524280k free | 空闲交换分区的大小 |
40928k cached | 作为缓存的交换分区的大小 |
~~~ 接下来我们举几个 top 命令常用的实例,来继续说明下 top 命令。
~~~ 比如我如果只想让 top 命令查看某一个进程,这时就可以使用“-p 选项”:
~~~ 只查看 PID 为 15273 的 apache 进程
~~~ 在 top 命令的交互界面中按“q”键会退出 top 命令。
~~~ 也可以按“?”或“h”得到 top 命令交互界面的帮助信息。也可以按“k”键终止某个进程,命令如下:
[root@localhost ~]# top -p 15273
[root@localhost ~]# top
top - 14:10:15 up 1 day, 15:15, 3 users, load average: 0.00, 0.00, 0.00
Tasks: 97 total, 1 running, 96 sleeping, 0 stopped, 0 zombie
Cpu(s): 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Mem: 625344k total, 574248k used, 51096k free, 66840k buffers
Swap: 524280k total, 0k used, 524280k free, 409324k cached
PID to kill:15273 // 按“k”键,会提示输入要杀死进程的 PID
~~~ 如果在操作终端执行 top 命令,并不能看到系统中所有的进程,
~~~ 默认看到的只是 CPU 占比靠前的进程。
~~~ 如果我们想要看到所有的进程可以把 top 命令的结果重定向到文件当中即可。
~~~ 不过 top 命令是持续运行的,这时就需要“-b”和“-n”选项了,具体命令如下:
~~~ 让 top 命令只执行一次,让后把结果保存到 top.log 文件中。
~~~ 这样就能看到所有的进程了
[root@localhost ~]# top -b -n 1 > /root/top.log
三、进程的查看:pstree 命令
### --- 查看进程树;可以查看到依赖性
~~~ 选项:
~~~ -p:显示进程的 PID
~~~ -u:显示进程的所属用户
[root@localhost ~]# pstree [选项]
### --- 查看进程树
[root@server11 ~]# pstree
systemd─┬─ModemManager───2*[{ModemManager}] // 第一个进程时systemd,其它所有进程都是依赖它的
├─NetworkManager───2*[{NetworkManager}]
├─VGAuthService
├─2*[abrt-watch-log]
├─abrtd
├─agetty
├─alsactl
├─atd
├─auditd─┬─audispd─┬─sedispatch
│ │ └─{audispd}
│ └─{auditd}
├─avahi-daemon───avahi-daemon
├─bluetoothd
├─crond
├─cupsd
├─dbus-daemon
├─dnsmasq───dnsmasq
├─gssproxy───5*[{gssproxy}]
├─httpd───5*[httpd] // apache下1个主进程下有5个子进程
├─irqbalance
├─ksmtuned───sleep
├─libvirtd───16*[{libvirtd}]
├─lsmd
├─lvmetad
├─master─┬─pickup
│ └─qmgr
├─polkitd───5*[{polkitd}]
├─rngd
├─rpcbind
├─rsyslogd───2*[{rsyslogd}]
├─smartd
├─sshd─┬─sshd───bash
│ └─sshd───bash───pstree
├─systemd-journal
├─systemd-logind
├─systemd-udevd
├─tuned───4*[{tuned}]
└─vmtoolsd───{vmtoolsd}
### --- 若是想查看主进程下所有的子进程
[root@server11 ~]# pstree -p // -p显示进程的ID号
systemd(1)─┬─ModemManager(612)─┬─{ModemManager}(656)
├─httpd(14944)─┬─httpd(14945)
│ ├─httpd(14946)
│ ├─httpd(14947)
│ ├─httpd(14948)
│ └─httpd(14949)