[Linux基础]-13-Linux进程管理
引言
这篇文章介绍Linux系统中几个非常常用的进程管理命令。
文章目录
- 0×1.Linux进程简介
- 0×2.如何使用ps命令查看Linux系统中的进程
- 0×3.Linux中父进程与子进程简介
- 0×4.Linux如何使用kill和pkill结束进程
- 0×5.Linux中进程的前后台执行切换
- 0×6.Linux中进程实时监控程序Top
0×1.Linux进程简介
理论上,一个进程被称为一个正在执行的程序,每当一个程序启动时系统就会为这个程序创建一个或多个进程,系统从硬件中(内存、CPU时间等等)分配资源为这个进程服务,每个进程都有一个唯一的PID(Process ID),通过这个PID我们可以快速的查找和终止进程。
进程又分为父进程和子进程,如果一个进程A执行了一条命令,这条命令可以在A进程空间中执行,也能通过A进程创建一个新的进程B来执行,这个被创建出来的进程B就叫做进程A的子进程,而进程A就叫做进程B的父进程。
除此之外,进程可以在前台运行,也能够在后台运行。
0×2.如何使用ps命令查看Linux系统中的进程
★ 查看与当前终端相关的进程
#直接使用ps命令,就能查看到与当前终端相关的进程列表
987@hk987.xyz:~$ ps
PID TTY TIME CMD
1621 pts/0 00:00:00 bash
1649 pts/0 00:00:00 ps
#加一个-l参数,意思是长格式输出,能够看到当前终端相关的进程的详细信息
987@hk987.xyz:~$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1000 1621 1620 0 80 0 - 56024 do_wai pts/0 00:00:00 bash
0 R 1000 1653 1621 0 80 0 - 56370 - pts/0 00:00:00 ps
在上面的ps -l中,每一列详细的介绍如下:
● F:进程旗标(process flags),通常代表进程的类型,以下是一些常见类型及其含义:
4:通常是守护进程(daemon) ,作为系统服务在后台运行,例如systemd
1:则表示此子进程为内核进程(kernel thread)
0:普通进程,用户空间中的常规进程
5:会话首领(session leader)进程, 会话首领的存在允许多个进程组成一个会话
● S:进程的状态,以下是一些常见的进程状态及其含义:
R:运行(running)进程当前正在运行或在运行队列中等待执行
S:休眠(sleeping)进程当前没有正在运行,但可以快速地被唤醒以继续执行
D:不可中断的休眠(uninterruptible sleep) 进程正在等待I/O操作完成
I:中断睡眠状态(Interruptible sleep),是一种特殊的休眠状态,进程在此状态下等待某些事件完成,例如等待文件I/O操作完成
T:停止(stopped) 进程已被暂停,不再执行任何操作
Z:僵尸(zombie)进程已经终止,一般是其父进程尚未等待其终止就退出了
● UID:表示进程的用户标识符(User ID)这个标识符用于指示哪个用户启动了该进程,可以通过“id”命令查看当前用户的UID,GID等
● PID:代表进程ID(Process ID)每个正在运行的进程都有一个唯一的PID,用于在系统内部标识和管理进程,是一个非负整数
● PPID:代表父进程ID(Parent Process ID) 每个进程都有一个父进程,除了初始进程(通常是 init或 systemd)外 PPID是指启动当前进程的父进程的PID
● C:通常表示进程的CPU利用率,这个字段显示了进程在其生命周期内使用的CPU时间的百分比
● PRI:代表进程的调度优先级(Priority),这个字段表示了操作系统在调度进程时考虑的优先级,通常是一个整数值,调度优先级是操作系统用
● NI:代表进程的Nice值(Nice Value),Nice值是用于调整进程调度优先级的一个参数,Nice值是一个整数,通常在范围 -20到 19之间,较低的Nice值意味着进程具有更高的调度优先级, NI值为0的进程具有默认的调度优先级,而NI值为-20的进程具有最高优先级,可能会优先于其他进程获得CPU时间
● ADDR:只知道如果这一列显示"-"表示进程是运行状态,并且这一列和内存有关,没有太多的资料介绍这一列的具体作用
● SZ:代表进程的内存大小(Size),这个字段显示了进程当前使用的物理内存大小,单位通常是千字节(KB)
● WCHAN:字段表示进程在等待的内核等待队列或等待通道,这个字段的值通常是一个标识符,代表了进程在等待的具体资源或事件
● TTY:TTY是“Teletype”的缩写,它代表任何终端或终端仿真器,例如终端窗口、虚拟控制台等,TTY列的值可以是以下几种类型:
?:进程没有与任何终端关联
ttyX:进程与具体的终端设备关联,其中 X是终端设备的标识符。 例如, tty1代表第一个虚拟控制
pts/X:进程与伪终端(pseudo-terminal,简称pts)关联,其中 X是伪终端的标识符。 伪终端通常用于远程登录会话或终端仿真器,例如, TTY列的值为 pts/0表示该进程是在一个伪终端(例如SSH会话或终端仿真器)上运行的
● TIME:表示进程已经消耗的 CPU 时间, 这个值表示进程自启动以来在 CPU 上运行的总时长,通常以"小时:分钟:秒"的格式显示,例如,如果 TIME 列的值为 02:30:15,这意味着该进程已经占用了CPU运行时间2小时30分钟15秒,那么为什么我们看到的大多数进程的CPU运行时间都是00:00:00,这是因为这个值是以 CPU 时间来衡量的,这意味着只有当进程实际上在 CPU 上运行时,这个值才会增加,对于短暂运行或者很少使用 CPU 资源的进程,它们的 TIME 值可能会非常小,以至于它在显示上被四舍五入显示成0
● CMD:表示启动进程的命令行。这个字段显示了用于启动进程的完整命令,包括命令名称和任何附加参数,例如,如果你启动了一个名为 example_process 的程序,并带有一个参数 -f,那么 CMD 列可能会显示为 example_process -f
★ 查看系统中所有进程(方法一)
#ps命令的-A参数会将所有的进程都显示出来
987@hk987.xyz:~$ ps -A
#详细格式输出
987@hk987.xyz:~$ ps -Al
★ 查看系统中所有进程(方法二)
#-aux参数含义:
#a:显示所有用户的进程,而不仅仅是当前用户
#u:使用用户可读格式显示进程信息,包括用户、CPU 使用、内存使用等
#x:同时显示没有控制终端的进程,通常用于显示守护进程或在后台运行的进
#“显示没有控制终端的进程”这句话是指:
#进程通常与一个控制终端关联,这是进程可以与用户交互的地方,如终端窗口
#但是,有些进程可能不与任何控制终端关联,这些进程通常在后台或作为系统服务运行
987@hk987.xyz:~$ ps -aux
在上面的ps -aux命令的输出中,每一列的含义如下:
● USER :启动进程的用户
● PID :进程ID,是进程的唯一标识符
● %CPU :进程使用的 CPU 时间占总 CPU 时间的百分比
● %MEM :进程使用的物理内存占总物理内存的百分比
● VSZ/WM :进程占用的虚拟内存
● RSS :进程的实际内存使用量(Resident Set Size),以KB为单位
● TTY :与进程关联的终端设备
● STAT :进程状态,如运行(R)、休眠(S)、僵尸(Z)等,有如下常见的状态:
< 表示高优先级的进程(not nice to other users)
N 低优先级(nice to other users)
I 多线程的进程(大写的i)
l 线程加锁(小写的L)
s 会话的领头进程(session leader)进程
+ 与终端关联的前台进程组
D 不间断睡眠(通常是IO)
S 可中断睡眠(等待事件完成)
T 因作业控制信号或正在被跟踪而停止
Z 已失效(“僵尸”)进程,父进程已经终止但作为子进程未被其父进程及时回收
R 正在运行或可运行(在运行队列上)
这些状态可以相互组合使用,例如“S<sl”表示“一个可中断睡眠并且具有高优先级的加锁领头进程”
● START :进程启动的时间和日期
● TIME :进程在 CPU 上运行的总时间
● COMMAND :启动进程的完整命令行
总结:ps -Al和ps -aux都能显示系统中所有的进程,他们的区别在于输出的格式以及每一列字段的差异,除此之外,在不同的发行版Linux中,对这两个命令的兼容性也不相同,大家可以根据实际环境取用。
★ 使用grep对结果进行筛选
#使用grep筛选出所有进程列表中包含ssh的进程
#通过上面的介绍我们知道这4行中的最后一行,是运行在pts伪终端0中的一条grep命令,也就是当前我们执行的这条命令本身
#其实下面4条输出中的后3行都是第一行的子进程,下一节介绍
987@hk987.xyz:~$ ps -aux | grep ssh
root 1011 0.0 0.1 15792 9180 ? Ss 16:56 0:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
root 2180 0.1 0.1 19032 11716 ? Ss 16:57 0:00 sshd: hk987 [priv]
hk987 2212 0.0 0.0 19076 6500 ? S 16:57 0:00 sshd: hk987@pts/0
hk987 2246 0.0 0.0 221812 2360 pts/0 R+ 16:57 0:00 grep --color=auto ss
0×3.Linux中父进程与子进程简介
在Linux系统中,每个进程都有一个父进程和可能有多个子进程,这种父子关系形成了进程的层次结构。
● 父进程:使用Linux中的特殊函数在其进程空间内创建出的子进程,父进程通常会等待其子进程的完成,并可能根据子进程的状态进行不同的操作。
● 子进程:由父进程创建并在父进程空间中运行的新进程,子进程会继承父进程的环境和资源。
这种父子关系的概念在Linux系统中非常重要,因为它允许进程组织成树状结构,使得进程间的管理和通信更加方便。
★ 使用ps -auxf命令查看父子进程树
#可以使用ps的-f参数,查看这种父子进程关系树
#第一行就是下面三行的父进程
#子进程第二行中的sshd: hk987 [priv]中的[priv]标识的含义:
#当用户登录动作发起时在进程后面添加[priv]标识,这个[priv]标识代表进程具有特权交互权限,仅用作进程标识用
#有些sshd进程会显示sshd: hk987 [net],这个[net]标识也是在网络IO操作之前就被添加到进程后面,仅用作进程标识用,代表这个进程用作网络IO操作
#对于这些进程标识,建议查看源码,能帮助很好的理解
#登录成功后,又从PID为2180号的父进程创建出一个子进程pts伪终端,终端编号是0
#然后在这个伪终端的进程空间中执行了下面这一条命令grep,这个grep也会从父进程2212空间中单独创建一个新的子进程
987@hk987.xyz:~$ ps -auxf | grep ssh
root 1011 0.0 0.1 15792 9180 ? Ss 16:56 0:00 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
root 2180 0.0 0.1 19032 11716 ? Ss 16:57 0:00 \_ sshd: hk987 [priv]
hk987 2212 0.0 0.0 19076 6500 ? S 16:57 0:00 \_ sshd: hk987@pts/0
hk987 2288 0.0 0.0 221680 2348 pts/0 S+ 17:11 0:00 \_ grep --color=auto ssh
★ 使用pstree命令查看父子进程树
pstree 命令是一个用于显示进程树的工具,它可以以层次结构的形式显示进程及其子进程, pstree 命令没有太多的命令行选项,以下是一些常用的参数:
#-p:显示进程ID,使用这个选项会在进程名称后面显示其进程ID
#-u:显示用户名称,使用这个选项会在进程名称后面显示其启动者的用户名
#-h:高亮显示当前进程及其父系进程
#-n:不排序,使用这个选项会按照进程启动的顺序而不是进程名称排序
#-a:详细输出,会显示每个进程的完整命令行,包括命令名称和参数
#在命令最后加上PID就会显示指定PID进程的完整树状结构,如果不加PID显示的就是系统中所有的进程
987@hk987.xyz:~$ pstree -anhpu 1022
sshd,1022
└─sshd,2079
└─sshd,2112,hk987
└─bash,2124
└─pstree,2168 -anhpu 1022
★ 使用echo命令查看当前终端PID以及其父进程PID
#使用$$可以打印出当前终端的PID
987@hk987.xyz:~$ echo $$
2124
#使用$PPID可以打印出当前终端父进程的PID
987@hk987.xyz:~$ echo $PPID
2112
#再使用pstree来分别显示一下当前终端的进程树以及其父进程的进程树
987@hk987.xyz:~$ pstree -anhpu 2124
bash,2124,hk987
└─pstree,2188 -anhpu 2124
#就可以很清晰的看到,是2112这个sshd进程,这个进程是hk987用户创建的
#在这个进程空间中有一个子进程bash,在这个bash进程中再创建了一个子进程执行了pstree命令
987@hk987.xyz:~$ pstree -anhpu 2112
sshd,2112,hk987
└─bash,2124
└─pstree,2189 -anhpu 2112
0×4.Linux如何使用kill和pkill结束进程
kill 和 pkill 都是 Linux 和 Unix-like 系统中用于终止进程的命令,但它们在使用和功能上有所不同
★ kill 命令常用用法,终止指定进程:
#使用进程ID(PID)来终止特定进程
#语法:kill PID
#首先让hk987.sh在后台执行(&符号是让命令在后台执行的意思,下一小节会介绍)
987@hk987.xyz:~$ bash hk987.sh &
[1] 2265
#查看一下hk987相关的进程,进程id是2265
987@hk987.xyz:~$ ps -aux | grep hk987
hk987 2265 0.0 0.0 222520 3436 pts/0 S 11:10 0:00 bash hk987.sh
hk987 2269 0.0 0.0 221680 2364 pts/0 S+ 11:10 0:00 grep --color=auto hk987
#使用kill命令来结束进程
987@hk987.xyz:~$ kill 2265
#再次查看,显示hk987.sh已经终止
987@hk987.xyz:~$ ps -aux | grep hk987
hk987 2271 0.0 0.0 221680 2360 pts/0 S+ 11:10 0:00 grep --color=auto hk987
[1]+ 已终止 bash hk987.sh
★ kill 发送 SIGKILL强制终止指定进程:
SIGKILL 是一个强制终止进程的信号,用于在无法正常终止进程时强制结束它,尽管它非常有用,但应谨慎使用。
#使用 -s 或 -SIGNAL 选项发送特定类型的信号,例如,发送 SIGKILL(强制终止)信号
#语法:kill -s KILL PID 或 kill -9 PID
#首先让hk987.sh在后台执行(&符号是让命令在后台执行的意思,下一小节会介绍)
987@hk987.xyz:~$ bash hk987.sh &
[1] 2275
#发送SIGKILL信号强行终止2275号进程
987@hk987.xyz:~$ kill -s KILL 2275
#或
987@hk987.xyz:~$ kill -9 2275
987@hk987.xyz:~$ ps -aux | grep hk987
hk987 2280 0.0 0.0 221680 2344 pts/0 S+ 11:16 0:00 grep --color=auto hk987
[1]+ 已KILL bash hk987.sh
★ kill 同时结束多个PID:
#语法:kill PID PID PID ...
#强行终止:kill -9 PID PID PID ...
#执行三个后台程序
987@hk987.xyz:~$ bash hk987.sh &
[1] 2293
987@hk987.xyz:~$ bash hk987.sh &
[2] 2295
987@hk987.xyz:~$ bash hk987.sh &
[3] 2297
#一次性结束三个后台程序进程
987@hk987.xyz:~$ kill 2293 2295 2297
987@hk987.xyz:~$ ps -aux | grep hk987
hk987 2300 0.0 0.0 221680 2360 pts/0 S+ 11:22 0:00 grep --color=auto hk987
[1] 已终止 bash hk987.sh
[2]- 已终止 bash hk987.sh
[3]+ 已终止 bash hk987.sh
★ kill 结束指定的pts终端:
#首先查看一下系统中连接着哪些pts终端
987@hk987.xyz:~$ w
USER TTY LOGIN@ IDLE JCPU PCPU WHAT
hk987 pts/0 14:36 1.00s 0.02s 0.00s w
root pts/1 14:48 3.00s 0.00s 0.00s -bash
hk987 seat0 14:40 0.00s 0.00s 0.00s /usr/libexec/gdm-wayland-session --register-session gnome-session
hk987 tty2 14:40 23:48 0.01s 0.01s /usr/libexec/gnome-session-binary
#ps -t命令是无法查看到其它用户的pts终端PID号的
987@hk987.xyz:~$ ps -t
PID TTY STAT TIME COMMAND
2546 pts/0 Ss 0:00 -bash
4626 pts/0 R+ 0:00 ps -t
#可以通过指定pts终端号来查看root用户连接的pts进程的PID号
#因为所有pts连接都会在/dev/pts下创建一个串行端口设备文件
#这里root的pts进程创建的文件名称是1,通过上面w命令已经获得
987@hk987.xyz:~$ ps -t /dev/pts/1
PID TTY TIME CMD
4599 pts/1 00:00:00 bash
#然后就能使用sudo权限强行结束root用户的pts连接了
#必须使用-9,也就是发送 SIGKILL强制终止信号,否则无法中断连接
987@hk987.xyz:~$ sudo kill -9 4599
★ pkill 根据进程名称或其他条件终止进程:
#首先使用pstree查看一下hk987创建了哪些进程
root@hk987.xyz:~# pstree -anhpu hk987
sshd,2420
└─bash,2431
systemd,2395 --user
└─(sd-pam),2398
#再使用root权限用户通过pkill的-u参数,结束hk987用户的所有进程
root@hk987.xyz:~# pkill -u hk987
root@hk987.xyz:~# pstree -anhpu hk987
未发现进程。
#直接使用程序名称结束进程,例如结束firefox浏览器进程
987@hk987.xyz:~$ pkill firefox
注意:使用 kill 命令需要知道目标进程的 PID,而 pkill 允许你使用进程名称或其他条件来识别和终止进程。pkill 可能会终止多个进程,因此在使用时需要小心,确保不会误杀其他重要进程。总的来说,kill 和 pkill 都是强大的进程管理工具,你可以根据自己的需求选择合适的命令来终止进程。
★ 使用pgrep筛选配合kill结束进程:
#首先假设我们当前终端目录下有一个这样的bash文件,命名为hk987.sh,这个sh文件会每3秒ping一次b站主页
#!/bin/bash
ping -i 3 bilibili.com >> bilibili.txt
#然后我给这个文件加上一个可执行权限
987@hk987.xyz:~$ sudo chmod +x hk987.sh
#现在让这个脚本在后台执行,并且启动三个hk987.sh脚本同时在后台运行
987@hk987.xyz:~$ ./hk987.sh &
[2] 2663
987@hk987.xyz:~$ ./hk987.sh &
[3] 2665
987@hk987.xyz:~$ ./hk987.sh &
[4] 2667
#可以通过前面学过的ps查看这三个脚本的进程
987@hk987.xyz:~$ ps -aux | grep hk987.sh
hk987 2663 0.0 0.0 222520 3428 pts/0 S 14:22 0:00 /bin/bash ./hk987.sh
hk987 2665 0.0 0.0 222520 3480 pts/0 S 14:22 0:00 /bin/bash ./hk987.sh
hk987 2667 0.0 0.0 222520 3456 pts/0 S 14:22 0:00 /bin/bash ./hk987.sh
hk987 2670 0.0 0.0 221816 2328 pts/0 S+ 14:24 0:00 grep --color=auto hk987.sh
#除了ps外,linux还提供了另外一个命令pgrep,pgrep 是一个用于查找进程 (PID) 的命令
#它根据进程的名称和其他条件来查找并显示匹配的进程 PID
#例如:
#1.仅显示匹配到的进程的PID
987@hk987.xyz:~$ pgrep hk987.sh
2663
2665
2667
#2.显示出匹配到的进程的PID和进程名称
987@hk987.xyz:~$ pgrep -l hk987.sh
2663 hk987.sh
2665 hk987.sh
2667 hk987.sh
#3.默认情况下pgrep是模糊匹配,也就意味着,不需要输入完整的进程名称,例如
987@hk987.xyz:~$ pgrep -l hk987
2663 hk987.sh
2665 hk987.sh
2667 hk987.sh
#但是在一些特殊情况下,假设以hk987开头的进程很多,我们就需要使用-x参数来精确匹配
987@hk987.xyz:~$ pgrep -x hk987 #这就意味着如果我们不输入完整的进程名称,就无法匹配到
987@hk987.xyz:~$ pgrep -x hk987.sh #必须输入完整的名称
2663
2665
2667
#4.有时候,我们执行的进程是一串带参数的命令,例如使用bash执行hk987.sh这个脚本
987@hk987.xyz:~$ bash hk987.sh &
[5] 2709
#这个时候我们再使用普通的匹配方式就不能匹配到带参数的命令
987@hk987.xyz:~$ pgrep -l hk987
2663 hk987.sh
2665 hk987.sh
2667 hk987.sh
#可以使用-f参数,匹配命令模式,注意,不携带-x参数的时候,仍然是模糊匹配
987@hk987.xyz:~$ pgrep -f "bash hk987"
2709
#携带了x参数,就要将命令输完整才能匹配到
987@hk987.xyz:~$ pgrep -fx "bash hk987"
987@hk987.xyz:~$ pgrep -fx "bash hk987.sh"
2709
#有了这些基础知识,我们再来配合kill命令结束进程
#首先,我们查看一下普通的hk987.sh进程有哪些
987@hk987.xyz:~$ pgrep -x hk987.sh
2663
2665
2667
#然后将这个命令的执行结果,传递给kill,这就等价于kill -9 2663 2665 2667
987@hk987.xyz:~$ kill -9 `pgrep -x hk987.sh`
#再次查看,就会显示已经kill掉了这三个进程
987@hk987.xyz:~$ pgrep -x hk987.sh
[2] 已杀死 ./hk987.sh
[3] 已杀死 ./hk987.sh
[4] 已杀死 ./hk987.sh
#同样的方法,可以结束携带参数的命令进程
987@hk987.xyz:~$ kill -9 `pgrep -fx "bash hk987.sh"`
[5]- 已杀死 bash hk987.sh
0×5.Linux中进程的前后台执行切换
在 Linux 中,进程可以在前台或后台运行,这与它们与终端的交互方式有关,下面我将为你演示如何在 Linux 中运行前台和后台进程:
#直接在终端中输入sleep命令,这个命令会让进程休眠传入的秒,本例是3600秒
#输入这个命令之后,终端会一直卡着等待倒计时结束
#这样如果我们还需要进行其他操作,就会非常不方便
987@hk987.xyz:~$ sleep 3600
#可以使用键盘上的ctrl+z组合键,让这个进程暂时挂起
^Z
[1]+ 已停止 sleep 3600
#然后再使用bg命令,将刚才挂起的进程放入后台执行
987@hk987.xyz:~$ bg
[1]+ sleep 3600 &
#那如果我同时使用ctrl+z组合键挂起多个进程
987@hk987.xyz:~$ sleep 6000
^Z
[2]+ 已停止 sleep 6000
987@hk987.xyz:~$ sleep 8000
^Z
[3]+ 已停止 sleep 8000
#就需要使用bg接上"%数字"的形式,来让指定挂起的进程继续在后台执行
987@hk987.xyz:~$ bg %3
[3]+ sleep 8000 &
987@hk987.xyz:~$ bg %2
[2]+ sleep 6000 &
#可以通过jobs -l命令看到后台正在执行的,或者被挂起的进程
987@hk987.xyz:~$ jobs -l
[1] 4866 运行中 sleep 3600 &
[2]- 4868 运行中 sleep 6000 &
[3]+ 4869 运行中 sleep 8000 &
#例如我挂起一个进程
987@hk987.xyz:~$ sleep 9000
^Z
[4]+ 已停止 sleep 9000
#再用jobs -l就能清晰的看到后台所有被挂起(暂停)和正在运行的进程
987@hk987.xyz:~$ jobs -l
[1] 4866 运行中 sleep 3600 &
[2] 4868 运行中 sleep 6000 &
[3]- 4869 运行中 sleep 8000 &
[4]+ 4870 停止 sleep 9000
#如果这个时候我想将某个进程放到前台来查看一下输出
#可以使用“fg %进程编号” 将对应编号的进程切换到前台
987@hk987.xyz:~$ fg %2
sleep 6000
#再次放到后台,然后查看一下后台的进程列表
^Z
[2]+ 已停止 sleep 6000
987@hk987.xyz:~$ jobs -l
[1] 4866 运行中 sleep 3600 &
[2]+ 4868 停止 sleep 6000
[3] 4869 运行中 sleep 8000 &
[4]- 4870 停止 sleep 9000
#如果我想结束某个后台进程,直接使用kill是不行的
987@hk987.xyz:~$ kill 4868
#被结束的进程ID仍然存在
987@hk987.xyz:~$ jobs -l
[1] 4866 运行中 sleep 3600 &
[2]+ 4868 停止 sleep 6000
[3] 4869 运行中 sleep 8000 &
[4]- 4870 停止 sleep 9000
#必须使用强制结束信号才能成功
987@hk987.xyz:~$ kill -9 4868
[2]+ 已KILL sleep 6000
987@hk987.xyz:~$ jobs -l
[1] 4866 运行中 sleep 3600 &
[3]- 4869 运行中 sleep 8000 &
[4]+ 4870 停止 sleep 9000
0×6.Linux中进程实时监控程序Top
top 是一个常用的系统监视工具,用于实时显示系统的运行状态,包括 CPU 使用率、内存使用情况、进程信息等。以下是 top 命令的一些基本用法和常见选项:
● 交互模式top查看当前进程
#在终端中可以直接输入top命令,打开进程实时监控
#默认模式下top是可交互的,并且每3秒刷新一次
987@hk987.xyz:~$ top
#下面是top交互模式常用的操作键
#k:输入k之后,会让你输入一个进程的PID,回车两次就能杀死这个PID对应的进程,如果不想结束任何进程,可以输入任意字母回车
#d:输入d后,可以输入一个时间(单位秒),指定默认的刷新频率
#V(大写):显示进程树
#H(大写):显示线程,默认只显示进程
#P(大写):按照CPU占用率从大到小排列
#M(大写):按照内存占用率从大到小排列
#shift+>:向后查看一页进程
#shift+<:向前查看一页进程
#c:显示进程的完整命令
#z:颜色切换
#m:切换内存显示样式
#t:切换cpu显示样式
#1:查看cpu多核情况
#W(大写):将当前配置写入~/.config/procps/toprc文件中,这样下次打开就会按照现在的设置
#q:退出top
● 非交互模式top查看当前进程
#有些情况下我们不需要使用交互功能,只需要top能够输出当前所有进程
#-n 1:指定 top 执行一次刷新
#-b:以批处理模式运行 top,这会使 top 不会进行任何交互,而是直接输出结果
987@hk987.xyz:~$ top -b -n 1
#或者将结果输出到文件
987@hk987.xyz:~$ top -b -n 1 > top.txt
● top仅监控指定用户或指定进程
#-u:监控指定用户
#-p:监控指定进程
#仅显示hk987用户的进程
987@hk987.xyz:~$ top -u hk987
#仅显示PID是2180的进程
987@hk987.xyz:~$ top -p 2180