原文链接:https://blog.csdn.net/nightmare_dimple/article/details/86663113
1.进程资源监控
1.1 gnome-system-monitor
gnome-system-monitor是Ubuntu系统自带的资源管理器,可以让我们在界面中动态查看所有进程资源以及计算内存消耗情况,可直接在命令行中输入gnome-system-monitor:
可以看见,以上内容能够很容易帮我们监控系统资源,但是如果我们需要将监控级别设定到指定程序级别,则需要对该界面进行相关配置:
左上角显示设置
我们可以通过左上角的按钮查询指定程序的进程号,也可以显示出每一个进程的执行命令行信息:
右上角筛选设置
默认显示的是当前用户所有的进程信息,但如果想知道当前活跃的进程信息,并显示父子进程的依赖关系,我们可以通过右上角按钮选择:
1.2 top
top也是Ubuntu系统自带的一个系统资源监控指令,同样是在命令行执行:
其中上方的%Cpu的意义如下:
us — 用户空间占用CPU的百分比。
sy — 内核空间占用CPU的百分比。
ni — 改变过优先级的进程占用CPU的百分比
id — 空闲CPU百分比
wa — IO等待占用CPU的百分比
hi — 硬中断(Hardware IRQ)占用CPU的百分比
si — 软中断(Software Interrupts)占用CPU的百分比
1
2
3
4
5
6
7
而下方的则是各个进程的详细信息,其中要注意的是:
PID: 进程号
USER: 进程所有者
PR: 进程优先级
VIRT: 进程所占虚拟内存大小,单位:B
RES: 进程所占物理内存大小,单位:B
SHR: 进程所占共享内存大小,单位:B
%CPU: 进程所占CPU使用率
%MEM:进程所占内存使用率
TIME+: 进程启动后所占总的CPU时间
COMMAND: 进程命令名
1
2
3
4
5
6
7
8
9
10
特别的,键盘按下1会显示所有核的信息,按下q会退出当前窗口。
1.3 htop
htop相对top来说,是一个更加清晰的系统资源监控器,不过需要先安装:
sudo apt install htop
1
同样在命令行执行:
2.利用进程号关闭进程
指定进程号,如果要关闭其对应进程,只需要执行:
kill 进程号
kill -15 进程号
1
2
以上两种方式会关闭正在执行的进程,不过依然会有部分程序会延时相应,或者不相应,所以我们可以强制关闭:
kill -9 进程号
1
进程号一定要填,不然默认关闭所有进程,包括我们的系统进程。
3.利用程序名关闭进程
3.1 直接关闭
Ubuntu提供了直接关闭进程的指令killall和pkill:
killall 进程名
pkill 进程名
1
2
不过这两个方法有三个缺点:
进程名指的是执行命令的名称,并不是命令行,即:
python test.py =>python
1
进程名如果超过15个字符会自动截断:
killall bt_uinfo_memcached x
killall bt_uinfo_memcac √
1
2
对于图形界面等关闭不了,因为属于tty,不属于command。
3.2 先查找再关闭
我们在第一章介绍gnome-system-monitor时,提到其自带查找进程号的功能,即search for open files;
Ubuntu提供了一种简单完全匹配工具pidof:
pidof 进程名
1
注意这里的进程名必须是完整的名称,如:python。
Ubuntu还提供了命令行工具进行查找:
ps -e | grep 进程名
ps -ef | grep 进程名
1
2
我们可以看到,仅仅-e所能匹配的进程不全,但是-ef能匹配更详细的命令行信息,更重要的是这种方式不是完整匹配,而是部分匹配。
对于ps -e,Ubuntu提供了更简洁的用法:
pgrep 进程名
pgrep -a 进程名
1
2
pgrep的缺点在于,无法实现ps -ef的命令行匹配功能,其优点在于可以只打印进程号,方便后续关闭。
我们如果既想拥有pgrep那样直接打印进程号的简洁,又想拥有ps -ef |grep方式匹配完整命令行的强大,可以利用awk语言编程实现,利用进程号在第二列的特性:
ps -ef | grep 进程信息 |awk '{print $2}'
1
有了这些进程的查找方式,那么关闭进程就很容易了,那么,如果我们想要一次性执行查找和关闭怎么办?可以利用xargs命令:
pidof python |xargs kill -9
pgrep python |xags kill -9
ps -ef |grep python |awk '{print $2}'|xargs kill -9
1
2
3
4.利用python关闭进程
4.1 os系统指令
python自身可以利用os模块的system功能执行命令行指令,如:
os.system('kill -9 进程号')
1
另外Python也可以获取自身程序的进程号:
os.getpid()
1
4.2 psutil库
psutil库能够轻松实现获取系统运行的进程和系统利用率(包括CPU、内存、磁盘、网络等)信息,它主要用来做系统监控,性能分析,进程管理。其安装方式如下:
pip install psutil
1
这里我不介绍其详细功能,只介绍如何利用其关闭特定进程。
获取当前系统所有进程:
psutil.pids()
1
返回所有进程号列表。
获取每个进程的详细信息:
psutil.Process(进程号)
1
返回的是该进程所对应的类,通过观察其属性可见,有很多信息可以利用:
那么我们可以这样进行匹配,假如我们要关闭包含train字样的python进程,那么可以:
import psutil
import os
for i in psutil.pids():
try:
p = psutil.Process(i)
if p.name() == 'python' and 'train' in ''.join(p.cmdline()):
os.system('kill -9 '+str(i))
except Exception:
pass
1
2
3
4
5
6
7
8
9
之所以要加入保护,是因为进程随时都处于启动和关闭状态,有的进程可能在处理过程中关闭了。