【前端&运维那点事儿】十五:Linux中的进程管理

1,308 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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%stst(steal time)意为虚拟时间百分比,就是当有虚拟机时,虚拟 CPU 等待实际 CPU 的时间百分比

第四行为物理内存信息:

内 容说 明
2046684 total物理内存的总量,单位为KB
846152 free空闲的物理内存数量
248788 used己经使用的物理内存数量
951744 buff/cache缓冲区和缓存区占用的内存

第五行为交换分区信息:

内 容说 明
1049596 total交换分区(虚拟内存)的总大小
1049332 free空闲交换分区的大小
264 used已经使用的交换分区的大小
1612208 avail Mem作为缓存的交换分区的大小

🍌 结束进程

🍍 进程信号

在开始之前我们先了解一下进程信号,下面列出了几个常用的进程信号:

信号代码信号名称说明
1SIGHUP该信号让进程立即关闭,然后重写读取配置文件后重启,平滑重启
2SIGINT程序终止信号,用于关闭前台进程,相当于ctrl+c
9SIGKILL用来立刻结束程序的运行,本信号不能阻塞、处理和忽略,一般用于强制中止
15SIGTERM正常结束进程的信号,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

pkillkillall一样,都是可以根据进程名称来结束一批进程,不过该命令还有一个有意思的功能就是按照终端号来结束某个终端下的进程,命令如下:

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个结束进程的命令。

如果对本篇文章对你有所帮助,可以点赞收藏评论支持一下我;如果有所疑问,欢迎私信~

如果对这个专栏感兴趣可以点一个关注呦~