持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第16天,点击查看活动详情
Hi~,我是一碗周,如果写的文章有幸可以得到你的青睐,万分有幸~
🍇 写在前面
先来介绍一下新开的这个专栏:《前端&运维那点事儿》将会从前端的角度,依次学习Linux→Nginx→Docker→持续集成→k8s,从而打造一个属于站在前端角度的运维专栏。
这篇文章介绍Linux中的进程管理,如果你熟悉Windows系统,那就应该知道【任务管理器】,实际上任务管理器中管理的就是进程;与Windows不同的是在Linux中管理进程使用的是一些命令。
🍒 进程?为什么要管理?
🍑 什么是进程
进程是一个“执行中的程序”,每一个进程都是一个实体、都有自己的虚拟地址空间。它与程序有着本质的区别,程序是静态的,是保存在磁盘上指令的有序合集;进程是动态的,它是运行中的程序,包含了进程的动态创建、调度和消亡的过程,是Linux的基本调度单位。
🍏 为什么需要进程管理
先来想一想在Windows中什么时候需要打开【任务管理器】:
-
查看当前CPU、内存等一些硬件资源的使用情况;
-
看一下后台运行着哪些进程;
-
如果某个软件、游戏卡死了,可以通过【任务管理器】来杀死进程。
这面这几个原因也是在Linux中为什么需要进程管理的原因。
🍎 显示进程状态(ps命令)
ps
命令是英文process status的缩写,该命令就可以被翻译为进程状态,使用该命令可以查看当前系统进程的所有信息,该命命令通过使用aux
作为参数,示例如下:
[root@ywanzhou ~]$ ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 43584 3908 ? Ss Oct26 0:07 /usr/lib/systemd/systemd --switched-root --system --deserialize 22
root 2 0.0 0.0 0 0 ? S Oct26 0:00 [kthreadd]
root 4 0.0 0.0 0 0 ? S< Oct26 0:00 [kworker/0:0H]
root 6 0.0 0.0 0 0 ? S Oct26 0:01 [ksoftirqd/0]
该命令的回显是一个每个字段的含义如下表:
字段 | 含义 |
---|---|
USER | 该进程是由哪个用户产生的 |
PID | 进程的 ID |
%CPU | 该进程占用 CPU 资源的百分比 |
%MEM | 该进程占用物理内存的百分比 |
VSZ | 该进程占用实际物理内存的大小,单位为 kb |
RSS | 该进程占用虚拟内存的大小,单位为 kb |
TTY | 该进程是在哪个终端运行的。 |
STAT | 进程状态 |
START | 该进程的启动时间 |
TIME | 该进程占用 CPU 的运算时间 |
COMMAND | 产生此进程的命令名。 |
其中TTY终端信息如下:
-
tty1 ~ tty7 代表本地控制台终端;tty1 ~ tty6是本地的字符界面终端,tty7 是图形终端。
-
pts/0 ~ 255 代表虚拟终端,一般是远程连接的终端;第一个远程连接占用 pts/0,第二个远程连接占用 pts/1,依次递增。
常见的进程状态如下所示:
-
-R
:该进程正在运行 -
-S
:该进程处于睡眠状态,可被唤醒 -
-T
:停止状态,可能是在后台暂停或进程处于除错状态 -
-Z
:僵尸进程。进程已经中止,但是部分程序还在内存当中 -
-s
:包含子进程 -
-l
:多线程 -
-+
:位于后台
除了aux
还可以添加-l
参数以长格式显示更加详细的信息,-e
显示所有进程:
-
ps -le
:以长格式显示当前系统的中的所有进程; -
ps -l
:以长格式显示当前Shell产生的进程;
示例如下:
[root@ywanzhou ~]$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
4 S 0 1976 1972 0 80 0 - 29184 do_wai pts/0 00:00:00 bash
0 R 0 12426 1976 0 80 0 - 38332 - pts/0 00:00:00 ps
每个字段的含义如下表所示:
字段 | 含义 |
---|---|
F | 进程标志,说明进程的权限;1表示可以被复制但不能被执行;4表示进程使用的是root用户的权限 |
S | 进程状态,同ps aux 中的STAT字段 |
UID | 运行该进程的用户ID |
PID | 进程ID |
PPID | 父进程ID |
C | 进程的CPU使用率 |
PRI | 进程的优先级,小值优先执行 |
NI | 进程的NICE值,数值大,表示较少占用CPU时间 |
ADDR | 该进程在内存的哪个位置 |
SZ | 该进程占用多大内存 |
WCHAN | 该进程是否在运行,'-' 表示正在运行 |
TTY | 该进程由哪个终端产生 |
TIME | 该进程占用CPU的运算时间 |
CMD | 产生此进程的命令名。 |
🍊 查看进程树
查看进程树可以使用pstree
命令,该命令可以将进程以树的形式进行展示,语法如下:
pstree [参数] [PID]
# -p 显示进程id
# -a 显示所有进程的所有详细信息,遇到相同的进程名可以压缩显示:
示例如下:
[root@ywanzhou ~]$ pstree
systemd─┬─BT-Panel───{BT-Panel}
├─BT-Task─┬─python
│ └─11*[{BT-Task}]
├─YDLive─┬─YDService─┬─sh───8*[{sh}]
│ │ └─22*[{YDService}]
│ └─8*[{YDLive}]
├─acpid
.................
🍋 监听进程
想要实现进程的监听,可以通过不停的执行ps
命令实现,显然这肯定不太现实;Linux中提供了top
命令,该命令可以实时的现实当前系统的运行状态。该命令由几个常用的参数:
选项 | 含义 |
---|---|
-b | 使用批处理模式输出,一般和-n 配合使用 |
-n | 次数,指定top 命令执行的次数。一般了-b 选项配合使用 |
-d | 秒数,指定top 命令每隔几秒更新。默认是3秒 |
例如下面这个命令:
top -b -n 5 > top.txt
这个命令可以让最近5次的结果写入top.txt
中
当我们键入top
后按下回车就进入了交互界面,交互界面的命令如下:
选项 | 含义 |
---|---|
? 或h | 显示交互模式的帮助 |
P | 按CPU使用率排序,默认就是此选项 |
M | 以内存的使用率排序 |
N | 以PID排序 |
q | 退出top |
接下来我们来解释一下top
命令回显的含义,内容如下:
top - 13:07:37 up 1 day, 12:27, 2 users, load average: 0.12, 0.12, 0.08
Tasks: 89 total, 1 running, 87 sleeping, 0 stopped, 1 zombie
%Cpu(s): 0.3 us, 0.3 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
KiB Mem : 2046684 total, 846152 free, 248788 used, 951744 buff/cache
KiB Swap: 1049596 total, 1049332 free, 264 used. 1612208 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1698 root 20 0 1029700 42168 19144 S 1.0 2.1 23:54.74 YDService
1431 root 20 0 1107408 40252 7416 S 0.3 2.0 1:13.06 BT-Task
1640 root 20 0 678448 12592 2440 S 0.3 0.6 8:33.51 barad_agent
1 root 20 0 43584 3916 2592 S 0.0 0.2 0:11.25 systemd
2 root 20 0 0 0 0 S 0.0 0.0 0:00.05 kthreadd
4 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:+
6 root 20 0 0 0 0 S 0.0 0.0 0:02.33 ksoftirqd/0
这个内容以第六行作为分界线,第六行之后就是系统的进程情况,这里就不多赘述了,主要解释一下前五行:
第一行主要为任务队列信息:
内 容 | 说 明 |
---|---|
13:07:37 | 系统当前时间 |
up 1 day, 12:27 | 系统的运行时间.本机己经运行1天12小时27分钟 |
2 users | 当前登录了两个用户 |
load average: 0.12, 0.12, 0.08 | 系统在之前 1 分钟、5 分钟、15 分钟的平均负载。如果 CPU 是单核的,则这个数值超过 1 就是高负载:如果 CPU 是四核的,则这个数值超过 4 就是高负载 |
第二行为进程信息:
内 容 | 说 明 |
---|---|
89 total | 系统中的进程总数 |
1 running | 正在运行的进程数 |
87 sleeping | 睡眠的进程数 |
0 stopped | 正在停止的进程数 |
1 zombie | 僵尸进程数。如果不是 0,则需要手工检查僵尸进程 |
第三行为CPU信息:
内 容 | 说 明 |
---|---|
0.3 us | 用户模式占用的 CPU 百分比 |
0.3 sy | 系统模式占用的 CPU 百分比 |
0.0%ni | 改变过优先级的用户进程占用的 CPU 百分比 |
99.3%id | 空闲 CPU 占用的 CPU 百分比 |
0.0%wa | 等待输入/输出的进程占用的 CPU 百分比 |
0.0%hi | 硬中断请求服务占用的 CPU 百分比 |
0.0%si | 软中断请求服务占用的 CPU 百分比 |
0.0%st | st(steal time)意为虚拟时间百分比,就是当有虚拟机时,虚拟 CPU 等待实际 CPU 的时间百分比 |
第四行为物理内存信息:
内 容 | 说 明 |
---|---|
2046684 total | 物理内存的总量,单位为KB |
846152 free | 空闲的物理内存数量 |
248788 used | 己经使用的物理内存数量 |
951744 buff/cache | 缓冲区和缓存区占用的内存 |
第五行为交换分区信息:
内 容 | 说 明 |
---|---|
1049596 total | 交换分区(虚拟内存)的总大小 |
1049332 free | 空闲交换分区的大小 |
264 used | 已经使用的交换分区的大小 |
1612208 avail Mem | 作为缓存的交换分区的大小 |
🍌 结束进程
🍍 进程信号
在开始之前我们先了解一下进程信号,下面列出了几个常用的进程信号:
信号代码 | 信号名称 | 说明 |
---|---|---|
1 | SIGHUP | 该信号让进程立即关闭,然后重写读取配置文件后重启,平滑重启 |
2 | SIGINT | 程序终止信号,用于关闭前台进程,相当于ctrl+c |
9 | SIGKILL | 用来立刻结束程序的运行,本信号不能阻塞、处理和忽略,一般用于强制中止 |
15 | SIGTERM | 正常结束进程的信号,kill 命令的默认信号。如果不能正常中止,才会尝试SIGKILL信号 |
可以使用kill -l
查看所有的进程信号;
🥭 kill
kill
命令是根据进程号也就是PID来确定进程的,我们可以通过kill -进程信号 PID
来结束进程:
kill -9 5432 # 强制结束5432这个进程
🍎 killall
该命令与kill
命令一样,都是用于结束进程的,不同的是该命令可以根据进程名批量结束进程,它还有两个常用的选项:
-
-i
:结束进程前进行询问 -
-l
:忽略进程名大小写
示例如下:
[root@ywanzhou ~]$ killall -i sshd
Kill sshd(1000) ? (y/N) N
Kill sshd(1191) ? (y/N) N
Kill sshd(1564) ? (y/N) y
这里后两个都是我本地连接的,关闭了一个连接。
🍏 pkill
pkill
与killall
一样,都是可以根据进程名称来结束一批进程,不过该命令还有一个有意思的功能就是按照终端号来结束某个终端下的进程,命令如下:
pkill -t 终端号 进程名
例如我们上面结束sshd
进程,一不小心就把自己的终端关闭了,现在我们就可以通过pkill
命令来指定终端号来结束,示例如下:
先使用w
命令查看当前已经登陆系统的用户列表:
[root@ywanzhou ~]$ w
15:11:47 up 15 min, 2 users, load average: 0.00, 0.01, 0.04
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 182.48.111.131 14:56 3.00s 0.05s 0.00s w
root pts/1 182.48.111.131 14:57 14:31 0.02s 0.02s -bash
这里结束pts/1
这个终端的连接,命令如下:
pkill -9 -t pts/1
还有下面这个命令:
[root@ywanzhou ~]$ ps aux | grep vim # 查看关于vim的进程,可以看到 pts/1 正在使用vim
root 4503 0.0 0.2 149100 4828 pts/1 S+ 15:15 0:00 vim
root 4580 0.0 0.0 112812 976 pts/0 S+ 15:16 0:00 grep --color=auto vim
[root@ywanzhou ~]$ pkill -9 -t pts/1 vim # 结束 pts/1 的vim
[root@ywanzhou ~]$ ps aux | grep vim # 检查结果
root 4680 0.0 0.0 112812 980 pts/0 S+ 15:16 0:00 grep --color=auto vim
🍐 写在最后
这篇文章就简单介绍了Linux如何进行进程管理,其中介绍了3个查看进程的命令和3个结束进程的命令。
如果对本篇文章对你有所帮助,可以点赞收藏评论支持一下我;如果有所疑问,欢迎私信~
如果对这个专栏感兴趣可以点一个关注呦~