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